函数指针和指针函数的区别?

来源:互联网 发布:无印良品淘宝正品店铺 编辑:程序博客网 时间:2024/06/01 08:32
博客内容来源:网络、书籍和自己整理补充
函数指针和指针函数的区别?
-->First、概念区分:
函数指针即指向这个函数的指针,定义为“数据类型 (*fun)(参数列表);”,such as "void (*fun)(int *, int *);"
指针函数即返回值是指针的函数,定义为“数据类型 *fun(参数类表);”,such as "char *fun(int *, int *);"

-->Secound、函数指针调用:
在C语言中,变量有它的地址,同理函数也是有地址的,把函数的地址赋给函数指针,再通过指针调用这个函数即可
for example:
第一步:定义函数指针,such as "int (*pfun)(int *, int *);"
第二步:定义函数,such as "int fun(int *, int *);"
第三步:把函数地址赋给函数指针,such as "pfun = fun;"
第四步:通过函数指针去调用这个函数"(*pfun)(p,q);",pfun是函数的地址,那么*pfun就是函数本身

-->Third、函数参数传递:
在C语言中,参数传递有两种方式,一种为值传递,另一种为指针传递。值传递即把实参的值传递给形参。指针传递即地址的传递,形参值的改变并不能改变实参的值,但是形参所指向的内容值得改变却可以改变实参。

-->Forth、指针函数:
危险点:当函数的返回值为指针类型时,应尽量不要返回局部变量的指针,因为局部变量是定义在函数内部,当这个函数的生命周期结束后,局部变量的栈内存也被释放了,因此不能够正确地得到返回值,但是这个指针地址已经返回了,但是这个地址已经是无效的了,所以对于这个指针的使用是很危险的

--Fifth、补充:数组指针和指针数组:
概念区分:
1、数组指针即指向数组的指针,such as "typename (*p)[n];",定义了一个指向含n个数据元素的二维数组的指针。(二维数组解析:such as int num[2][4];可以看作由两个num[4]的数组构成,数组名num指向第一个元素,num[0]指向{num[0][0],num[0][1],num[0][2],num[0][3]},num[1]指向{num[1][0],num[1][1],num[1][2],num[1][3]};num = num[0] = &num[0][0];num + 1 = num[1] = &num[1][0];二位数组名可以看作是一个指向指针数组的指针
example supply:
int (*p)[4];//函数指针
int num[2][4];
p = num;
-->p = num[0]; p + 1 = num[1]; sizeof(p) = 4; sizeof(*p) = 4*4(p所指向的是4*sizeof(int)个字节); sizeof(*(p+1))= 4*4; sizeof(num) = 2*4*4; 
因为p是指向一个数组一行元素的整体的指针,如果要对数组的每个元素进行读写,需要用强制类型转换,把指向4个int类型的指针转换成指向1个int类型的指针(把p所指向的第一个地址传递给一个"int *q"指针,int *q = (int *)p;)
2、指针数组即定义了一个数组,数组包含了n个指针变量,such as "typename *p[n];"中含有n个指针变量p[0]、p[1]...p[n-1],p = &p[0];(p为数组首元素地址,p[0]为数组首元素,元素为指针变量)p + 1 = &p[1];sizeof(p) = n * sizeof(typename),p为数组名代表整个数组,不管是指针数组还是普通数组; 数组名p是指针常量,不能直接进行指针运算,但是可以传递给函数来进行。可以通过"p[x]"来对指针数组进行赋值,such as p[2] = "abc"。
#include <stdio.h>

int main()
{
    char *a[2];
    char aa[2];
    a[0] = "abc";
    a[1] = "def";
    printf("sizeof(a) = %d,sizeof(aa) = %d\n", sizeof(a),sizeof(aa));
    printf("a[0] = %s,a[1] = %s\n",a[0],a[1]);
    return 0;
}
输出结果:
希望能对大家有帮助!谢谢阅读!
0 0