近期看了一本【美】Peter Van Der Linden 写的《C专家编程》,将一些概念总结记录如下:
1. C语言把数组形参当作指针, 如:func(char p[])
2. 数组下标的规则高数我们如何计算左值pea[i][j], 首先找到pea[i]的位置, 然后根据偏移量[j]取得字符。因此,pea[i][j]将被编译器解析为:
*(*(pea+i)+j)
+i 会根据定义pea数组是和类型算,如int pear[i][j], 就会等于pea+i * 4, int占4个字节。
3. 使用指针从函数返回一个数组
int (*paf())[20]{int (*pear)[20];pear = calloc(20, sizeof(int));if(!pear) longjmp(error, 1);return pear;
}
你用下面这样的方法来调用函数:
int (*result)[20];
result = paf();
(*result)[3]=12;
4. NULL指针会导致printf 函数崩溃。
5. 一个函数指针数组可以像下面这样声明:
void (*state[MAX_STATES])();
如果知道了函数名,就可以像下面这样对数组进行初始化.
extern int a(), b(), c(), d();
int (*state[])()= {a, b, c, d];
可以通过数组中的指针来调用函数:
(*state[i])();
甚至可以去掉指针形式,把上面的调用写成:
state[i]()
甚至:
(********state[i])();
这是一个ANSI C中流行的不良方法:调用函数与通过指针调用函数(任意层次的指针间接引用)可以使用同一语法。