嵌入式-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

虽然可以实现,但是不建议这样使用,而且编译器也在编译的时候也会抛出警告。

 

posted @ 2022-10-31 21:03  WellMandala  阅读(91)  评论(0编辑  收藏  举报