首先要了解一个优先级问题
[ ] 和()具有相同的优先级 都比 *(解引用运算符)的优先级要高
数组指针 :变量名先与[ ] 结合 变成一个数组 然后 在与 * 结合成为一个指针
如下所示
int *p[3];
定义的是一个含有三个指针元素的数组 且 指针指向的都是整型(int)
如下我们定义a,b,c三个变量 且使用 p 数组中的指针指向他们
int *p[3];
int a = 1,b = 2,c = 3;
p[0] = &a; p[1] = &b; p[2] = &c;
printf("*p[0] = %d \n",*p[0]);
printf("*p[1] = %d \n",*p[1]);
printf("*p[2] = %d \n",*p[2]);
然后我们打印结果
由此可以看出 p数组中的确包涵着三个指针
指针数组 :顾名思义,一个指针指向类型的是一个数组
同样的我们定义一个指针数组
int (*p)[3];
上面的定义表明 p指针指向的是一个含有三个整型元素的数组
现在给其中的元素进行赋值
int (*p)[3];
p = (int *)malloc(3 * sizeof(int));
*(*p + 0) = 1;
*(*p + 1) = 2;
*(*p + 2) = 3;
初始化的指针 是需要申请内存才能进行操作,所以我首先申请了 3个int大小的内存
这里解释一下为什么要使用两个*(解引用符)进行赋值
第一次解引用 *p表示的是 含有三个整型数组的内存 此时还不是里面的数据
然后再一次解引才是里面的数据
打印看一下
可以看出打印出来的和我们预想的是一样的
OK 通过上面的讲解 我们可以更好地理解下面的内容---函数指针和指针函数
函数指针:顾名思义 首先这是一个函数 它返回的是一个指针类型的数据
先定义一个函数指针
int *getmax(int *a,int *b){
return *a > *b?a:b;
}
这个函数的功能是返回值较大的那个函数的地址
int *p,*num1 = 7,*num2 = 2;
p = getmax(&num1,&num2);
printf("*p = %d\n",*p);
运行如上代码 打印结果
发现他确实如我们预期的那样打印出了正确的结果
指针函数:一个指针它指向的内容是一个函数
老规矩定义一个函数
这里我们依旧拿比大小的函数来举例
int getmax(int a,int b){
return a> b?a:b;
}
只不过我们将返回值和传入值都变成了普通的整型
来分析一下上面的函数 返回值的类型是 int 传入的形参也是两个int型的
所以我很可以这样定义指针函数
int (*p)(int,int);
第一个值表示返回类型 第二个是指针名 第三个是传入类型
执行如下代码
int (*p)(int,int);
p = getmax;
printf("max is %d\n",(*p)(5,2));
发现我们想要的结果被正确地执行了出来
如果觉得讲得好的 来个小小地赞吧ヾ(◍°∇°◍)ノ゙