关于指针与函数.docVIP

  • 0
  • 0
  • 约9.75千字
  • 约 10页
  • 2016-11-26 发布于重庆
  • 举报
关于指针与函数

. 首先,在C语言中函数是一种function-to-pointer的方式,即对于一个函数,会将其自动转换成指针的类型.如: 代码: #include void fun() { } int main() { printf(%p %p %p\n, fun, fun, *fun); return 0; } 这三个值的结果是一样的. 其实对于最后的那个*fun, 即使前面加上很多个*号, 其结果也不变, 即**fun, ***fun的结果都是一样的. 对于这个问题, 因为之前讲过函数是一种 function-to-pointer方式, 其会自动转换成指针的类型, fun是该函数的地址, 为指针类型, fun是一个函数, 会转换成其指针类型, 而对于*fun, 由于fun已经变成了指针类型, 指向这个函数, 所以*fun就是取这个地址的函数, 而又根据function-to-pointer, 该函数也转变成了一个指针, 所以以此类推, 这三个值的结果是相同的. 2. 如何调用一个地址上的函数 ??如果知道了一个函数所在的地址, 可以将其强制转化成某一种类型的函数指针, 然后再根据这个指针去调用这个地址的函数. 如: 代码: #includestdio.h typedef void (*pfun)(int); void f(int i) { ? ?? ???printf(i = %d\n, i); } int main() { ? ?? ???unsigned long add; ? ?? ???add = (unsigned long)f; ? ?? ???((pfun)add)(10); ? ?? ???(*(pfun)add)(20); ? ?? ???return 0; } 使用(void (*)(int))的方式可以将一个地址转换成一个带int参数且没有返回值的函数的指针类型, 然后再去调用, 由于第1点中讲的function-to-pointer, 所以最后两条语句中加与不加那个*号效果都是一样的. 在嵌入式方面经常用到这种方式. 3. 函数指针数组的用法. 有时候需要定义一个数组, 其内容为一系列的函数指针, 然后对其进行调用, 如: 代码: #include typedef int (*pfun)(int, int); int max(int v1, int v2) { return (v1 v2 ? v1 : v2); } int min(int v1, int v2) { return (v1 v2 ? v1 : v2); } int sum(int v1, int v2) { return (v1 + v2); } int main() { pfun p[3]; p[0] = max; p[1] = min; p[2] = sum; printf(p[0] = %d\n, (p[0])(3, 5)); printf(p[1] = %d\n, (p[1])(4, 6)); printf(p[2] = %d\n, (p[2])(1, 2)); return 0; } 虽然感觉这种方法有点累赘, 但是也算是一种使用的方式, 所以介绍一下. 4.返回一个指向数组的指针的方式 可以让函数返回一个指向数组的一个指针, 如: 代码: #include #include typedef int (*pfun)[10]; pfun p() { pfun m; int i; m = (pfun)malloc(10 * sizeof(int)); if (m == NULL) { printf(malloc error\n); exit(1); } for (i = 0; i 10; i++) *(*m+i) = i+1; return m; } int main() { pfun a; int i; a = p(); for (i = 0; i 10; i++) printf(%d , *(*a+i)); printf(\ndone\n); return 0; } 这种方式中,int (*a)[10]是一个指向一维数组的一个指针, 而p()也是返回一个指向一维数组的一个指针. 5.返回一个函数指针的指针 对这个问题, signal()函数是最好的例子, 代码: void (*signal (int signo, void (*func)(int)))(int); 很多朋友刚开始看这个函数定义的时候是不太懂, 其实可以一步一步地慢慢看, 我以前是这样分析的, 希望能对大家有用. int (*p)(); 这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数. int (*fun())(); 这个式

文档评论(0)

1亿VIP精品文档

相关文档