原创文章,转载请注明出处:http://blog.csdn.net/yanghaoran321/article/details/7658582
1、只有当确实需要时,才应该使用多层间接访问,不然程序将会变得更庞大,更缓慢并且难以维护;
2、关于一些高级声明:
int f; //一个整型变量;
int *f; //一个指向整型的指针;
int f(); //一个返回值为整型的函数;
int *f(); //一个返回值为整型指针的函数;
int (*f)(); //一个返回值为整型的函数指针;
int f[]; //一个元素为整型的数组;
int *f[]; //一个元素为指向整型的指针的数组;
int f()[]; //推断出的含义是一个返回整型数组的函数,但是这个声明是非法的,函数只能返回标量值,不能返回数组;
int f[](); //推断出的含义是一个元素类型为返回值为整型的函数的数组,但是这个声明也是非法的,因为数组元素必须具有相同的长度,不同的函数可能具有不同的长度;
int (*f[])() //一个元素类型为指向函数的返回值为整型的函数指针的数组;
int *(*f[])() //一个元素类型为指向函数的返回值为指向整型指针的函数指针的数组;
3、函数指针最常见的两个用途是转换表和作为参数传递给另一个函数;
4、对函数指针执行间接访问之前必须把它初始化为指向一个函数:
int (*pf)(int) = &f;
初始化表达式中&操作符是可选的,因为函数名被使用时总是编译为函数指针;
调用函数:
int ans;
ans = f(25);
ans = (*pf)(25);
ans = pf(25);
第一种调用函数过程:首先函数名f被转换为一个函数指针,该指针指定函数在内存中的位置,然后函数操作符调用该函数,执行开始于这个地址的代码;
第二种调用函数过程:执行函数操作符之前,将函数指针转换为函数名,其后的过程与前者一样;
第三种调用函数过程:省略了将函数名转换为函数指针,直接执行开始与这个地址的代码;
5、C程序的main函数具有两个形参,一个为argc,表示命令行参数的数目,第二个为argv,指向一组参数值,这些元素每个都是指向一个参数文本的指针,它的第一个参数就是程序的名称;
6、出现在表达式中的字符常量的值是一个常量指针,它指向字符串的第一个字符,和数组名一样,你既可以用指针表达式也可以用下标来使用字符串常量;