- 0
- 0
- 约9.75千字
- 约 10页
- 2016-11-26 发布于重庆
- 举报
关于指针与函数
. 首先,在C语言中函数是一种function-to-pointer的方式,即对于一个函数,会将其自动转换成指针的类型.如:
代码:
#includevoid 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.htypedef 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. 函数指针数组的用法.有时候需要定义一个数组, 其内容为一系列的函数指针, 然后对其进行调用, 如:
代码:
#includetypedef 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#includetypedef 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())();这个式
您可能关注的文档
- 传输介质的特性.doc
- 低年级写话指导课教案.doc
- 优质油菜高产保优施肥技术教案.doc
- 体卫艺副主任述职报告.doc
- 使用ADC0809的AD转换实验.doc
- 便携式数据采集器使用操作规程.doc
- 信息第1章信息基础.doc
- 假如用一个小型的公司或者企业像要搭建一个双处理器服务器.doc
- 偶发分枝杆菌感染综述.doc
- 傅雷中学2009学年第一次月考六年级数学试卷.doc
- 2025-2026学年天津市和平区高三(上)期末数学试卷(含解析).pdf
- 2025-2026学年云南省楚雄州高三(上)期末数学试卷(含答案).pdf
- 2025-2026学年甘肃省天水市张家川实验中学高三(上)期末数学试卷(含答案).docx
- 2025-2026学年福建省厦门市松柏中学高二(上)期末数学试卷(含答案).docx
- 2025-2026学年广西钦州市高一(上)期末物理试卷(含答案).docx
- 2025-2026学年河北省邯郸市临漳县九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省石家庄二十三中七年级(上)期末历史试卷(含答案).docx
- 2025-2026学年海南省五指山市九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省唐山市玉田县九年级(上)期末化学试卷(含答案).docx
- 2025-2026学年河北省邢台市市区九年级(上)期末化学试卷(含答案).docx
原创力文档

文档评论(0)