一、函数声明与定义不同
函数的声明就是声称一个函数的名字,只是说明函数的名字,不涉及函数的实现,即没有函数体,所以函数的声明只包括前三个部分。
函数定义就是确定一个函数的意义,即让函数具有某项功能,但是这里可不是只有函数体,总要指明这个函数体是那个函数的吧,所以函数的定义包含了一个函数的所有部分。
二、参数传递
1、指针变量作为函数参数
指针遍历作为实参调用时是:“值传递”,将其“值”赋给形参,调用时不会影响实参的”值“(地址)。
更好的解释,实参时抽屉的钥匙,在传参时,实参复制了一把钥匙传给形参,而被调函数拿到钥匙的副本后,进行操作可以分为两类
1)对钥匙本身做了一些操作(对指针本身进行操作)
2)通过钥匙对抽屉里的内容进行了一些操作(对指针本身进行操作)
两种操作都不可能影响实参的值(即钥匙原本),却有可能改变实参所指向变量的值(即抽屉里的内容)。
2、数组名作为函数参数
数组名本身是一个特殊的指针变量,其值是数组的首地址,因此作为实参时其传给形参的时内存中某指定单元的地址,调用过程中形参数组与实参数组占用同一段内存单元,对形参数组操作也就是对实参数组的操作
3、结构体数组做函数参数
1)结构体数组的元素作为实参:值传递的方式
2)结构体数组名作为实参:同整型数组数组名作为实参一样,传递给形参的是内存中已指定的单元的地址,调用过程中形参数组与实参数组占用同一段内存单元,因此形参数组的操作就是对实参数组的操作
4、多个返回值的C语言函数
1)利用全局变量
2)传递数组指针
多个返回值作为数组元素定义成一个数组的形式,并使该数组的地址作为函数的形式参数,以传址的方式传递数组参数
3)传递结构体指针
如果知道返回的数个数值类型不一致,可以通过定义全局变量实现多个返回指的C语言函数,也可以把返回的数个值定义成一个结构体,同样以传递结构体指针的方式把结构体的指针传递给形参结构体指针,那么函数中对形参结构体的修改也是对实参结构体的修改,函数被调用后获取的实参结构体成员即函数的多个返回值。
5、回掉函数
回掉函数是一个通过函数指针调用的函数。如果把函数指针(函数的入口地址)传递给另一个函数,当这个函数指针被用来调用它所指的函数时
Node * Search_List(Node * node,const int value)
{
while (node != NULL)
{
if(node -> value == value)
{
break;
}
node = node ->next;
}
return node;
}
回掉函数:
Node * Search_List(Node * node,int(*compare) (void const *,void const *),void const *desired_value)
{
while (node != NULL)
{
if(compare((node->value_address),desired_value) == 0)
{
break;
}
node = node ->next;
}
return node;
}