1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<windows.h> 4 /* 举列子说明什么是函数指针 */ 5 6 //以一个加减乘除 7 8 void Add(int a, int b){ 9 printf("%d + %d = %d " , a , b , a+b); 10 } 11 12 void Sub(int a , int b ) { 13 printf("%d - %d = %d ", a, b, a - b); 14 } 15 16 void Mul(int a, int b) { 17 printf("%d * %d = %d ", a, b, a * b); 18 } 19 void Div(int a, int b) { 20 printf("%d / %d = %d ", a, b, a / b); 21 } 22 23 24 25 //对于数组指针。 26 void func() { 27 int * py[5] ; //定义一个数组指针 28 int aa[] = { 1,2,3,4,5,6 }; 29 py[0] = aa; 30 for (int i = 0; i < sizeof(aa) / sizeof(int) ; i++) 31 printf("%d " , py[0][i]); 32 puts(""); 33 } 34 //对于指针数组 35 void funcp() { 36 37 int(*pt)[5] ; 38 int aa[] = { 1,2,3,4,5 }; 39 pt= &aa; 40 for (int i = 0; i < 5; i++) { 41 printf("%d ",(*pt)[i]); 42 } 43 puts(""); 44 } 45 46 int main( void ) { 47 system("echo 下面现实的是指针数组 "); 48 funcp(); 49 system("echo 下面现实的是数组指针 "); 50 func(); 51 //函数指针的用处 52 system("echo 下面现实的是函数指针 "); 53 void (*p)(int, int)= Add; 54 p(1,2); 55 //函数数组指针 ,这里需要区分指针数组和数组指针 56 /* 57 ...[]优先级高于* 58 数组指针 : (*p)[] 像函数指针一样,表示对于一个数组的指针,指针的类型是数组 59 int a[10]; 60 int (*p)[]=a; 61 指针数组 : *p[] ==*(p[]) 数组里的每一个元素为都为指针 62 63 */ 64 system("echo --下面现实的是函数指针数组---- "); 65 void(*ps[])(int, int) = { Add , Sub , Div ,Mul }; 66 for (int i = 0; i < 4; i++) { 67 ps[i](1,2); 68 } 69 getchar(); 70 return 0; 71 }
由上面那个列子:
我们就可以大概知道这些:
指针 ---》指向的是一个地址、
数组指针: 形如 int *p[4] -->说的是 p[0]~p[3]均为指针:
如图:
对于指针数组: 形如: int (*p)[5] ;
这 *p是一个指针,但是不是一个 普通的一级指针,有点像二级指针,但是没有二级指针那么大的权限,这样比喻吧:
举个日常的列子:
早上我们都要吃早饭(你丫,要是硬要说你不吃,那就不吃好了! ),但是至于要吃什么--随便,但是规定你,只能吃五碗。指针数组就是这样,你可以指向任何东西,但是都有限制(元素有限制)。
函数指针: 顾名思义是指向函数的指针, 形如: void (*p) (int a ) ; 这个指针的指向范围就更加的小了,就是只能指向函数。就好比,你早上要么不吃早饭,要吃,就得给老子吃胡萝卜啥的一样一样的。
至于函数指针数组,函数数组指针,其实搞懂了,前面的几种含义,后面的这些指针的意思,大概都可以有清晰的认识。
const int *p ; ----指针常量,其所指向的对象,只能有读取的权限,并没有写入的权限。
int * const p ; -----常量指针,其地址不能改变。但是改地址的值可读可写。
-----------------以上都是依据自己编程经验的理解,以及平时使用的理解来写的。如果有误,还请指点。--------------------------