user-0 提问: 有关二级指针的一些疑问和猜想

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

user: user-1
content: 仅供参考：//在堆中开辟一个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 //---------------  //在堆中开辟一个2×3×4×5的4维int数组 #include <stdio.h> #include <malloc.h> int ****p; int h,i,j,k; void main() {     p=(int ****)malloc(2*sizeof(int ***));     if (NULL==p) return;     for (h=0;h<2;h++) {         p[h]=(int ***)malloc(3*sizeof(int **));         if (NULL==p[h]) return;         for (i=0;i<3;i++) {             p[h][i]=(int **)malloc(4*sizeof(int *));             if (NULL==p[h][i]) return;             for (j=0;j<4;j++) {                 p[h][i][j]=(int *)malloc(5*sizeof(int));                 if (NULL==p[h][i][j]) return;             }         }     }     for (h=0;h<2;h++) {         for (i=0;i<3;i++) {             for (j=0;j<4;j++) {                 for (k=0;k<5;k++) {                     p[h][i][j][k]=h*60+i*20+j*5+k;                 }             }         }     }     for (h=0;h<2;h++) {         for (i=0;i<3;i++) {             for (j=0;j<4;j++) {                 for (k=0;k<5;k++) {                     printf(" %3d",p[h][i][j][k]);                 }                 printf("\n");             }             printf("--------------------\n");         }         printf("=======================\n");     }     for (h=0;h<2;h++) {         for (i=0;i<3;i++) {             for (j=0;j<4;j++) {                 free(p[h][i][j]);             }             free(p[h][i]);         }         free(p[h]);     }     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 //-------------------- //======================= //  60  61  62  63  64 //  65  66  67  68  69 //  70  71  72  73  74 //  75  76  77  78  79 //-------------------- //  80  81  82  83  84 //  85  86  87  88  89 //  90  91  92  93  94 //  95  96  97  98  99 //-------------------- // 100 101 102 103 104 // 105 106 107 108 109 // 110 111 112 113 114 // 115 116 117 118 119 //-------------------- //======================= //

user: user-0
content: 引用 1 楼 user-3 的回复:p、b、c分别指向了3块内存，  p是一个地址数组，它本身指向的内存块肯定是连续的5个指针大小的内存，但是它的各元素值可能是离散的，p[0]与c一样指向了第2 次申请的堆内存，p[1]跟b一样指向了第3次申请的堆内存。  32位程序，一个指针大小也就4字节，p指向的堆内存就是20字节，p[0]跟p[1]肯定是连续的，就相差4字节。也就是说二级指针p的内存空间只是用来存储元素中的地址 而不是b和c的值 因此分配的空间不用范围大到包括指针b和指针c的地址?

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组谢谢 我去认真学习一下

user: user-0
content: 谢谢各位大神的回答，是我表达不清楚 我想问得是在一维数组中地址是连续的 那么二维数组呢？ 上述的二级指针如果我们是当作一个二维数组看待 指针c和指针b记录的是一个字符 但同时可以看作是一个二维数组中的第一维数组 那么它们的地址是连续的没错 那么二维数组的内存空间是否连续的?二级指针的地址是否跟二维数组一样是连续的?如果不连续 那么给二级指针分配的内存空间又是指什么?

user: user-2
content: 首先，你打印p的地址有问题 printf( "%p,%p\n", p, p+1 );这个才是p的地址，b和c的地址只是赋值给 *p 和 *(p+1)   举一个简明的例子。 有五个并排的格子，编号即为p+0, p+1, p+2... 有两个不知道什么东西的东西b和c，只知道它们所处的位置  此刻在前格子里面记录它们所在的地址 *p = c; *(p+1) = b;  地址是变量在内存中的位置（格子所在的地址），指向的内存其实就是记录在这个内存中的一个值（格子内所记录的地址）

user: user-3
content: p、b、c分别指向了3块内存，  p是一个地址数组，它本身指向的内存块肯定是连续的5个指针大小的内存，但是它的各元素值可能是离散的，p[0]与c一样指向了第2 次申请的堆内存，p[1]跟b一样指向了第3次申请的堆内存。  32位程序，一个指针大小也就4字节，p指向的堆内存就是20字节，p[0]跟p[1]肯定是连续的，就相差4字节。