C语言的三级指针指向内存地址的问题

时间:2023-02-06 01:05:59
#include <stdio.h>

int main()
{
int i = 10;
int a = 30;
int *p = &i;
int **pp = &p;
int ***ppp = &pp;
printf("&i=%d   &a=%d   &p=%d   &pp=%d   &ppp=%d\n", &i, &a, &p, &pp, &ppp);
printf("***ppp=%d  **ppp=%d  *ppp=%d  \n", ***ppp, **ppp, *ppp);
return 0;
}

请问下***ppp不是三级指针吗? 为什么会有**ppp这样的形式?**ppp又为什么会指向&i的地址,而*ppp这样的形式为什么会指向&p的地址  这2个我不是很理解,麻烦大神解释下,谢谢!

5 个解决方案

#1


多级指针,必须逐级赋值(初始化),否则是野指针

#2


中间任何一级都不能跳过

#3


《牛肉干》
C语言上机课,某女同学偷偷吃起牛肉干。
有一粒牛肉干掉到了键盘上,卡在7和8键之间。
女同学就在键盘上抠啊、抠啊、抠啊……
程序里一行代码变成这个样子:
int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a;
后来的结局是
————程序顺利通过编译,运行结果正确!
//在堆中开辟一个3×4×5的3维int数组
#include <stdio.h>
#include <malloc.h>
int ***p;
int i,j,k;
void main() {
    p=(int ***)malloc(3*sizeof(int **));
    if (NULL==p) return;
    for (i=0;i<3;i++) {
        p[i]=(int **)malloc(4*sizeof(int *));
        if (NULL==p[i]) return;
        for (j=0;j<4;j++) {
            p[i][j]=(int *)malloc(5*sizeof(int));
            if (NULL==p[i][j]) return;
        }
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            for (k=0;k<5;k++) {
                p[i][j][k]=i*20+j*5+k;
            }
        }
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            for (k=0;k<5;k++) {
                printf(" %2d",p[i][j][k]);
            }
            printf("\n");
        }
        printf("---------------\n");
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            free(p[i][j]);
        }
        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
//---------------
// 20 21 22 23 24
// 25 26 27 28 29
// 30 31 32 33 34
// 35 36 37 38 39
//---------------
// 40 41 42 43 44
// 45 46 47 48 49
// 50 51 52 53 54
// 55 56 57 58 59
//---------------

#4


C语言的三级指针指向内存地址的问题

#5


多级指针并没有什么神奇,递归定义罢了~

#1


多级指针,必须逐级赋值(初始化),否则是野指针

#2


中间任何一级都不能跳过

#3


《牛肉干》
C语言上机课,某女同学偷偷吃起牛肉干。
有一粒牛肉干掉到了键盘上,卡在7和8键之间。
女同学就在键盘上抠啊、抠啊、抠啊……
程序里一行代码变成这个样子:
int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a;
后来的结局是
————程序顺利通过编译,运行结果正确!
//在堆中开辟一个3×4×5的3维int数组
#include <stdio.h>
#include <malloc.h>
int ***p;
int i,j,k;
void main() {
    p=(int ***)malloc(3*sizeof(int **));
    if (NULL==p) return;
    for (i=0;i<3;i++) {
        p[i]=(int **)malloc(4*sizeof(int *));
        if (NULL==p[i]) return;
        for (j=0;j<4;j++) {
            p[i][j]=(int *)malloc(5*sizeof(int));
            if (NULL==p[i][j]) return;
        }
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            for (k=0;k<5;k++) {
                p[i][j][k]=i*20+j*5+k;
            }
        }
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            for (k=0;k<5;k++) {
                printf(" %2d",p[i][j][k]);
            }
            printf("\n");
        }
        printf("---------------\n");
    }
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) {
            free(p[i][j]);
        }
        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19
//---------------
// 20 21 22 23 24
// 25 26 27 28 29
// 30 31 32 33 34
// 35 36 37 38 39
//---------------
// 40 41 42 43 44
// 45 46 47 48 49
// 50 51 52 53 54
// 55 56 57 58 59
//---------------

#4


C语言的三级指针指向内存地址的问题

#5


多级指针并没有什么神奇,递归定义罢了~