美文网首页
二级指针

二级指针

作者: lxr_ | 来源:发表于2021-10-09 14:26 被阅读0次
#include <stdio.h>

int main(int argc, char** argv)
{

    int num = 520;
    int* p = &num;  //指针p存放num的地址
    int** pp = &p;   //二级指针pp存放指针p的地址

    printf("num:%d,*p:%d,**p:%d\n", num, *p, **pp);  //num:520,*p:520,**p:520 三者相等

    printf("&p:%p,pp:%p\n", &p, pp);  //&p:0053F730,pp:0053F730  两者相等,每次运行结果不一样

    printf("&num:%p,p:%p,*pp:%p\n", &num, p, *pp);  //&num:0135F9EC,p:0135F9EC,*pp:0135F9EC 三者相等,每次运行结果不一样

    //指针数组和二级指针
    char* str[] = {   //该指针数组存放的都是地址,字符串用指向第一个字符的指针来表示
        "hello",
        "world",
        "xian"
    };
    //数组中都是指针,且数组又可以用指针来访问,故可以用二级指针(指向指针的指针)指向指针数组
    char** pStr1[2];  
    char** pStr2;

    pStr1[0] = &str[0];    //str[0]为字符串首地址,再次取地址即为二级指针
    pStr1[1] = &str[1];

    pStr2 = &str[2];

    printf("pStr2:%s\n", *pStr2);  //pStr2:xian

    printf("pStr1:\n");
    for (int i = 0; i < 2; i++)
    {
        printf("%s", *pStr1[i]);  //helloworld
    }
    printf("\n");

    //************数组指针和二维数组***************
    int array[2][3] = {
        {0,1,2},
        {3,4,5}
    };
    int** pa = array;
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            //printf("%2d", *(*(pa + i) + j));   //程序崩溃,因为pa每次加1其跨度为sizeof(int)=4个字节,无法访问第i行第j列
            printf("%2d", *(*(array + i) + j));//可正确访问 第i行第j列,array加1跨度为sizeof(int)*3=12字节
            // 0 1 2
            // 3 4 5
        }
        printf("\n");
    }

    printf("pa: %p,pa+1:%p\n", pa, pa + 1);            //pa: 006FFAF0,pa+1:006FFAF4       相差4个字节
    printf("array:%p,array+1:%p\n", array, array + 1); //array:006FFAF0,array+1:006FFAFC  相差12个字节

    
    //********正确利用指针指向二维数组:数组指针,而不是二级指针***********
    int(*ppa)[3] = array;   //加&或不加&都可以,两者都一样,数组名本身就是地址,建议此处不加,意义更明确,array指向的是第一行整个数组
    printf("%p %p\n", array, &array);   //两个值相等

    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            printf("%2d", *(*(ppa + i) + j));   //数组指针每次加1的跨度与array一样,为sizeof(int)*3=12个字节,故可以正确访问第i行第j列
            //  0 1 2
            //  3 4 5
        }
        printf("\n");
    }
    return 0;
}

相关文章

网友评论

      本文标题:二级指针

      本文链接:https://www.haomeiwen.com/subject/nlyqoltx.html