1、指针
指针本身存储变量的地址,当*与之配合使用时,*与指针的整体可以代表变量本身。
如
1: int a = 0;
2: int *b = &a;
3: (*b) = 2; //相当于 a = 2;
那么在声明时特别注意
1: //*与指针结合代表一个变量(形如*pointer )
2: int* a,b,c; //第一段声明,此处不是声明了三个指针
3: int b,c,*a; //实际等价于此行
4:
5: //特别地,如果进行了typedef定义如下:
6: typedef char * StringPointer
7: //在声明变量时可能这个问题会非常隐蔽
8: StringPointer a,b,c; //b ,c 是char型
9:
10: //所以建议每行只声明一个变量,并初始化。如:
11: StringPointer a = NULL;
12: //在声明指针的时候*与指针名字放在一起,如
13: int *a,b,c;
14: //这样就不会误认为三个都是指针了。
函数指针
这种指针指向函数,可以用来在函数中动态调用其他的函数。代码如下
1: void ABC(int);
2: int main(int argc,char *argv[]){
3: void (*abc)(int);
4: abc=ABC;
5: (*abc)(1); //此处就是调用ABC()
6: }
7: void ABC(int a)
8: {
9: a = 10;
10: }
c支持强制转换,那么对于一个变量的值强制转换为函数指针时(void (*)(int))a
取《c陷阱与缺陷》的一个例子:
1: (*(void(*)())0)()
以上代码即为调用地址为0处的函数(此函数无参数)。