C语言学习——6

一、函数

概念:具有特定功能的代码模块。

1.函数的一般形式

​ 返回值 函数名(形式参数列表: 形参)

​ {

​ 代码块;

​ return 返回值;

​ }

2.函数的调用

​ 函数名(实参列表:实参);

练习

实现一个交换函数,交换两个变量的值。

/*===============================================
*   文件名称:eg1.c
*   创 建 者:     
*   创建日期:2025年07月20日
*   描    述:
================================================*/
#include <stdio.h>
void swap(int *a,int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}


int main(int argc, char *argv[])
{ 
    int a = 11;
    int b = 20;
    swap(&a,&b);
    printf("a = %d , b = %d\n",a,b);
    return 0;
} 

3.函数传参

(1)复制传递

被调用的函数的形参,不能访问实参。

void swap(int a,int b);

(2)地址传递方式

void swap(int *a,int *b);

(3)全局变量传参

int a = 10;

int func(int x);

void main()
{
    func(a);
}

(4)一位数组传参

传的是数组的地址

void func(int a[6]);

void func(int a[]);

//最常用
void func(int *a);
练习

封装一个一维整型的数组的冒泡排序函数

/*===============================================
*   文件名称:eg2.c
*   创 建 者:青木莲华     
*   创建日期:2025年07月20日
*   描    述:
================================================*/
#include <stdio.h>

/*
 * 函数名 : Bob
 * 参数:
 * *p     :数组首地址
 * size   :数组内元素个数
 * 功能	 :实现数组冒泡排序(升序)
 * */
void Bob(int *p,int size)
{
    int temp = 0;
    for(int i = 0 ; i < size - 1 ; i++)
        for(int j = 0 ; j < size - 1 - i ; j++)
            if(p[j] > p[j+1])
            {
                temp = p[j];
                p[j] = p[j+1];
                p[j+1] = temp;
                /*
                p[j] = p[j] ^ p[j+1];
                p[j+1] = p[j] ^ p[j+1];
                p[j] = p[j] ^ p[j+1];
                */
            }
}



int main(int argc, char *argv[])
{ 
    int a[8] = {13,55,44,32,2,7,9,15};
    Bob(a,8);
    for(int i = 0 ; i < 8 ; i++)
    {
        printf("%d\t",a[i]);
    }
    printf("\n");
    return 0;
} 


alt

(5)传参二维数组

void show(int a[][4],int h,int l);
void show(int (*p)[4],int h,int l);
void show(int *p,int num);

int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

练习

找出二维数组中的最大值

/*===============================================
*   文件名称:eg3.c
*   创 建 者:青木莲华     
*   创建日期:2025年07月20日
*   描    述:
================================================*/
#include <stdio.h>

int getMaxNum(int *p,int size)
{
    int max = *p;
    for(int i = 0 ; i < size ; i++)
        if(max < p[i]) max = p[i];
    return max;
}
void show(int *p,int size)
{
    for(int i = 0 ; i < size ; i++)
        printf("%d\t",p[i]);
    puts("");
}

int main(int argc, char *argv[])
{ 
    int a[3][4] = {1,33,44,5,2,66,71,8,9,10,111,12};
    show(a[0],12);
    int max = getMaxNum(a[0],12);
    printf("Max : %d\n",max);
    return 0;
} 
取随机数

#include time.h

alt

4.指针函数

指针函数:返回类型是一个指针的函数

注意:

1.指针函数不能返回局部变量的地址

2.可以实现链式编程

链式编程示例

char *strcpy(char *dest, const char *src);

put(strcpy(str,"xxxxxxxx"));
练习

仿照strcpy,实现封装自己的Mystrcpy

/*===============================================
*   文件名称:eg4.c
*   创 建 者:青木莲华     
*   创建日期:2025年07月20日
*   描    述:
================================================*/
#include <stdio.h>

char *MyStrcpy(char *dest ,const char *src)
{
    char *temp = dest;
    while(*src != '\0')
    {
        *temp = *src;
        temp++;
        src++;
    }
    *temp = '\0';
    return dest;
}


int main(int argc, char *argv[])
{ 
    char str1[32] = "";
    char str2[32] = "hello world!";
    puts(MyStrcpy(str1,str2));
    return 0;
} 

5.函数指针

概念:是一个指针,指向一类函数的指针。

一般形式

​ 返回值 (*函数指针名) (形参);

eg

int Add(int x,int y)
{
	return x+y;
}

int (*funcp)(int x,int y);
funcp = Add;
funcp = &Add;	//等价于 funcp = Add;

(1)利用函数指针调用函数:

​ 函数指针名(实参);

funcp(10,20);
(*funcp)(10,20);

6.函数指针数组

概念:是一个数组,元素类型是指向函数的指针。

int (*func[2])(int x,int y);


int (*p[2])(int X,int y);
p[0] = Add;
p[1] = &Sub;
printf("%d\n",p[0](10,20));
printf("%d\n",(*p[1])(10, 20) );
return 0;

7.main函数的参数

int main(int argc, char *argv[]);
int argc 		//命令行执行时所传进来参数的个数
char *argv[]	//命令行传入参数的首地址