c语言指针高级话题
2016-05-09 23:42
483 查看
1.高级声明
int f;
一个整形变量。
int *f;
一个指向整形的指针。
int f();
一个返回值为整形的函数。
int *f();
明确表达式是如何求值的,首先执行的是函数操作符();()优先级高于*间接访问操作符,因此这是一个函数,它的返回值是指向整形的指针。
int (*f)();
明确表达式是如何求值的,有两对括号,从左到右,第一个括号只起到聚组的作用,迫使间接访问在函数调用之前进行,使f成为一个函数指针,它所指向的函数返回一个整形值。
int * (*f)()
结合前面的说明,可以推出,f仍然是一个指针,它所指向的函数返回一个整形指针。
int f[]
f是一个整形数组。
int *f[];
f是仍然是数组。只不过现在存放元素的是指向整形的指针。
int (*f[])();
第一个括号可知,f是一个数组,只不过存放的元素是指向某种类型的指针,由后面的的括号可知,数组的元素的类型是函数指针,函数的返回值是一个整形。
int * (*f[])();
第一个括号可知,f是一个数组,只不过存放的元素是指向某种类型的指针,由后面的的括号可知,数组的元素的类型是函数指针,函数的返回值是一个指向整形的指针。
其中:
int (*f)(),函数指针,最常用的便是回调函数了。
int (*f[])(); 常用的有转移表
以下是转移表的一个简单例子,环境:ubuntu 12.04,
编译运行
int f;
一个整形变量。
int *f;
一个指向整形的指针。
int f();
一个返回值为整形的函数。
int *f();
明确表达式是如何求值的,首先执行的是函数操作符();()优先级高于*间接访问操作符,因此这是一个函数,它的返回值是指向整形的指针。
int (*f)();
明确表达式是如何求值的,有两对括号,从左到右,第一个括号只起到聚组的作用,迫使间接访问在函数调用之前进行,使f成为一个函数指针,它所指向的函数返回一个整形值。
int * (*f)()
结合前面的说明,可以推出,f仍然是一个指针,它所指向的函数返回一个整形指针。
int f[]
f是一个整形数组。
int *f[];
f是仍然是数组。只不过现在存放元素的是指向整形的指针。
int (*f[])();
第一个括号可知,f是一个数组,只不过存放的元素是指向某种类型的指针,由后面的的括号可知,数组的元素的类型是函数指针,函数的返回值是一个整形。
int * (*f[])();
第一个括号可知,f是一个数组,只不过存放的元素是指向某种类型的指针,由后面的的括号可知,数组的元素的类型是函数指针,函数的返回值是一个指向整形的指针。
其中:
int (*f)(),函数指针,最常用的便是回调函数了。
int (*f[])(); 常用的有转移表
以下是转移表的一个简单例子,环境:ubuntu 12.04,
/************************************************************************* > File Name: zhuanyitable.c > Author: ma6174 > Mail: ma6174@163.com > Created Time: Mon 09 May 2016 09:53:58 PM CST ************************************************************************/ **#include<stdio.h> #include<stdlib.h> #define M 4 int myadd(int a, int b); int mysub(int a, int b); int mymul(int a, int b); int mydiv(int a, int b); int (*oper_func[])(int a, int b) = { myadd, mysub, mymul, mydiv }; char oper_sequence[M][10] = { "myadd", "mysub", "mymul", "mydiv" }; int main(int argc, char** argv) { if(argc < 3) { printf("usage: ./test integer integer operation, for example: ./test 2 1 mysub\n"); exit(1); } int i, seq = -1; int a = atoi(argv[1]); int b = atoi(argv[2]); char *oper = argv[3]; for(i=0; i<M; i++) { if(strncmp(oper_sequence[i], oper, 3) == 0) seq = i; } if(seq < 0) { exit(1); } int result = oper_func[seq](a, b); printf("%s:%d\n", oper, result); return 0; } int myadd(int a, int b) { return a+b; } int mysub(int a, int b) { return a-b; } int mymul(int a, int b) { return a*b; } int mydiv(int a, int b) { return a/b; }
编译运行