嵌入式-C语言基础:二级指针
二级指针:可以理解为指向指针的指针,存放的是指针变量的地址。
下面用一级指针来保存一个指针变量的地址;
#include<stdio.h> int main() { int *p1; int *p2; int data; p1=&data; p2=&p1; printf("p1保存的地址=%p\n",&data); printf("data=%d\n",*p1); printf("p2的地址=%p\n",&p2); return 0; }
输出结果:
p1保存的地址=000000000061FE0C
data=0
p2的地址=000000000061FE10
现在使用二级指针来实现同样的功能:
#include<stdio.h> int main() { // int *p1; // int *p2; // int data; // p1=&data; // p2=&p1; // printf("p1保存的地址=%p\n",&data); // printf("data=%d\n",*p1); // printf("p2的地址=%p\n",&p2); int data; int *p1; int **p2; p1=&data; p2=&p1; printf("p1保存的地址=%p\n",&data); printf("data=%d\n",*p1); printf("p2的地址=%p\n",p2); printf("data=%d\n",**p2); return 0; }
输出结果:
p1保存的地址=000000000061FE14
data=0
p2的地址=000000000061FE08
data=0
二级指针和二级数组避坑
#include<stdio.h> /* 野指针是指向位置随机的(乱指一气),错误的指针,系统无法对其进行操作。野指针指向的值是非法的内存地址,指向的内存是不可用的。 */ int main() { //二级指针和二维数组避坑 int scores1[3][4]={ {10,20,30,40}, {50,60,70,80}, {90,100,110,120} }; //定义一个二级指针 int **p1; p1=scores1; printf("p1:%p\n",p1); printf("scores1:%p\n",scores1); printf("*p1:%p\n",*p1);//*p1是一个野指针,不是我们认为的会变成列地址 **p1=2200;//修改scores[0][0] printf("done\n"); return 0; }
如果想让一个二级指针p指向一个二级数组,那么*p不是你认为的二维数组的列地址,而是一个野指针,是无法对二维数组进行操作的。如果想对二维数组修改。,可以通过使用
数组指针来指向二维数组的地址,再让二级指针指向数组指针的地址,而不能直接让二级指针指向一个二维数组。
#include<stdio.h> int main() { int scores2[3][4]={ {10,20,30,40}, {50,60,70,80}, {90,100,110,120} }; //定义一个二级指针 int **p2; //定义一个数组指针 int (*p3)[4]=scores2; //让二级指针指向数组指针地址 p2=&p3; printf("p3:%p\n",p3); printf("scores2:%p\n",scores2); //修改scores p2[0][0]=120; printf("scores2[0][0]:%d\n",scores2[0][0]); return 0; }
输出结果:
p3:000000000061FDE0
scores2:000000000061FDE0
scores2[0][0]:120
虽然可以实现,但是不建议这样使用,而且编译器也在编译的时候也会抛出警告。
4556