一、函数
函数是一个完成特定功能的代码模块,其程序代码独立,通常要求有返回值,也可以是空值。
1、形式
数据类型 函数名(数据类型 形参1,数据类型 形参2, ... ,数据类型 形参n)
{
语句块;
return [表达式];
}
说明:
1> 数据类型是函数返回值的数据类型,即数据类型和return后的表达式的数据类型一致;
2> 函数名符合合法的标识符;
3> 形参的数据类型一定不能省略;
4> {}及里边的语句块统称 函数体;
5> {}中的语句可以是0条,也可以是一条,也可以是多条;
6> return后边的表达式是函数最终的返回值,此返回值的数据类型要和函数名前数据类型保持一致;
7> 如果函数名前的数据类型为void型,说明此函数没有返回值,return语句可以写(即 return;)也可以不写;
eg:
int main()
{
return 0;
}
2、函数调用
函数名(实参1,实参2,...,实参n);
3、函数传参
形式:
值传递
本质:将实参空间的值拷贝一份到形参空间,形参的改变一定不会影响实参的值;
地址传递
本质:将实参的地址传给形参,通过形参一定可以修改到实参的值;
全局变量
本质:利用全局变量的作用域;
4、函数声明
数据类型 函数名(数据类型 形参1,数据类型 形参2, ... ,数据类型 形参n);
二、数组传参
1、一维数组传参
值传参
eg:
int *fun(int a[10], int len)
{
//int a[10]是数组形式,本质是指针,即sizeof(a)的值为4;
}
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int len = sizeof(a) / sizeof(a[0]);
fun(a,len);
return 0;
}
地址传参
eg:
int *fun(int *p, int len)
{
//int a[10]是数组形式,本质是指针,即sizeof(a)的值为4;
}
int main()
{
int a[10] = {1,2,3,4,5,6,7,8,9,10};
int len = sizeof(a) / sizeof(a[0]);
fun(a,len);
return 0;
}
注意:
一维数组的值传递和地址传递,本质都是地址传参;
2、二维数组传参
int fun(int (*p)[4],int len)
{
}
int main()
{
int a[3][4];
fun(a,3);
}
三、指针函数
本质:是函数,只不过函数的返回值是指针;
1、形式
数据类型 *函数名(数据类型 形参1,...,数据类型 形参n)
{
语句块;
return 地址值;
}
说明:
其中
<数据类型> 、<函数名称>、<形式参数说明> 等与一般函数定义相同;
在<函数名称>之前的*符号,说明该函数返回 一个地址量。
eg:
char *strcpy(char *dest, const char *src);
四、函数指针
本质:是指针,只不过指针指向一个函数
函数指针是用来存放函数的地址,这个地址是一个函数的入口地址,而且是函数调用时使用的起始地址。
1、形式
数据类型 (*函数指针名)(数据类型 形参1, ..., 数据类型 形参2);
注意:
说明定义了一个函数指针,这个指针指向一个 返回值是int 型, 参数是 (数据类型 形参1, ..., 数据类型 形参2) 的一个函数;
int add(int a, int d); //add函数的类型是 int (int a, int b)
int (*p) (int a, int b) = add;
其中
<数据类型>是函数指针所指向的函数的返回值类型;
<函数指针名称>符合标识符命名规则
<参数说明列表>应该与函数指针所指向的函数的形参说明保持一致;
(*<函数指针名称>)中,*说明为指针()不可缺省,表明为函数的指针。
五、函数指针数组
1、形式
数据类型 (*数组名[元素个数])(数据类型 形参1,..., 数据类型 形参 n);
eg:
int add(int a, int b)
{
}
int mul(int a, int b)
{
}
int (*a[2]) (int , int ) = {add, mul};
a[0](10,20);或者 (*a)(10,20);
本文深入探讨了函数的定义、调用、传参方式,包括值传递和地址传递,并解析了一维和二维数组的传参机制。同时,详细介绍了指针函数、函数指针和函数指针数组的概念与应用,提供了丰富的示例代码。

被折叠的 条评论
为什么被折叠?



