函数是任何一门语言中必不可少的部分,正是由这些函数组成了程序。首先谈一下C语言中的函数指针与指针函数,再了解一下函数参数传递的相关原理。
1.函数指针与指针函数
(1) 函数指针 即指向这个函数的指针,定义为 数据类型 (fun)(参数列表) ,()的优先级比高,所以fun加括号。如 void (*fun)(int,int*);
(2)指针函数 即返回值是指针的函数,定义为 数据类型 * fun(参数列表). 如 char* fun(int*,int*);即返回值为char*型。
在C语言中,变量有它的地址,同理函数也是有地址的。那么把函数的地址赋给函数指针,再通过函数指针调用这个函数就可以了。
第一步: 定义函数指针,如 int (pfun)(int,int*);
第二步: 定义函数 如 int fun(int*,int*);
第三步: 把函数的地址赋给函数指针,即 pfun=fun;
第四步: 通过函数指针去调用这个函数 (*pfun)(p,q); //pfun是函数的地址,那么 *pfun当然就是函数本身了。
2.函数参数传递问题
在C语言中,有两种参数传递的方式 ,一种是值传递,另一种是指针传递。
值传递很好理解,即把实参的值传递给形参。
而指针传递传的是地址在C语言中,形参值的改变并不能改变实参的值,但形参所指向内容值的改变却能改变实参,这一点非常的重要,是指针传递的精华所在。
3. 指针函数
当函数的返回值为指针类型时,应该尽量不要返回局部变量的指针,因为,局部变量是定义在函数内部,当这个函数调用结束了,局部变量的栈内存也被释放了,因此,不能够正确的得到返回值。实际上,内存已经被释放了,但这个指针的地址已经返回过去了,但是这个地址已经是无效的了,此时,对这个指针的使用是很危险的。
4. 野指针
野指针并不是NULL,而是指向垃圾内存的指针。
有两种情况可以导致野指针:
(1) char* p;
(2)malloc,free
第一种情况是定义指针,但没有给指针赋地址,此时,对指针的使用是很危险的,因为你不知道它指向哪里,是个野指针。
第二种情况,malloc是在堆上分配内存,必须由用户手动释放,当释放之后,指针指向的内存已经释放掉了,但指针本身的地址还存在,即指向了一个无效的内存,所以这时的指针为野指针,必须把这个指针p=NULL.