Fork me on GitHub

C语言多维数组问题

开门见山,上实验代码

#include <stdio.h>

int main()
{
    char i, j, k, l, m = 0, a[2][3][4][5];
    for(i = 0;i < 2;i++) {
        for(j = 0;j < 3;j++) {
            for(k = 0;k < 4;k++) {
                for(l = 0;l < 5;l++) {
                    a[i][j][k][l] = m++;
                    printf("a[%d][%d][%d][%d] = %3d <- 0x%p\t", i, j, k, l, a[i][j][k][l], &a[i][j][k][l]);
                    if(!(m % 3)) printf("\n");
                }
            }
        }
    }
    printf("(((*(a + 1) + 2) + 3) + 4)    -   0x%p   =   a[1][9]\n", (((*(a + 1) + 2) + 3) + 4));
    printf("((*(*(a + 1) + 2) + 3) + 4)   -   0x%p   =   a[1][2][7]\n", ((*(*(a + 1) + 2) + 3) + 4));
    printf("(*(*(*(a + 1) + 2) + 3) + 4)  -   0x%p   =   &a[1][2][3][4]\n", (*(*(*(a + 1) + 2) + 3) + 4));
    printf("*(*(*(*(a + 1) + 2) + 3) + 4) -   %-8d     =   a[1][2][3][4]\n", *(*(*(*(a + 1) + 2) + 3) + 4));
    printf("((((a + 1) + 2) + 3) + 4)     -   0x%p   =   a[10]\n", ((((a + 1) + 2) + 3) + 4));
    printf("(((a + 1 + 2) + 3) + 4)       -   0x%p   =   a[10]\n", (((a + 1 + 2) + 3) + 4));
    printf("((a + 1 + 2 + 3) + 4)         -   0x%p   =   a[10]\n", ((a + 1 + 2 + 3) + 4));
    printf("(a + 1 + 2 + 3 + 4)           -   0x%p   =   a[10]\n", (a + 1 + 2 + 3 + 4));
    printf("Hello world!\n");
    return 0;
}
`</pre>
运行结果:
<pre>`a[0][0][0][0] =   0 &lt;- 0x0029FE83       a[0][0][0][1] =   1 &lt;- 0x0029FE84       a[0][0][0][2] =   2 &lt;- 0x0029FE85

a[0][0][0][3] =   3 &lt;- 0x0029FE86       a[0][0][0][4] =   4 &lt;- 0x0029FE87       a[0][0][1][0] =   5 &lt;- 0x0029FE88

a[0][0][1][1] =   6 &lt;- 0x0029FE89       a[0][0][1][2] =   7 &lt;- 0x0029FE8A       a[0][0][1][3] =   8 &lt;- 0x0029FE8B

a[0][0][1][4] =   9 &lt;- 0x0029FE8C       a[0][0][2][0] =  10 &lt;- 0x0029FE8D       a[0][0][2][1] =  11 &lt;- 0x0029FE8E

a[0][0][2][2] =  12 &lt;- 0x0029FE8F       a[0][0][2][3] =  13 &lt;- 0x0029FE90       a[0][0][2][4] =  14 &lt;- 0x0029FE91

a[0][0][3][0] =  15 &lt;- 0x0029FE92       a[0][0][3][1] =  16 &lt;- 0x0029FE93       a[0][0][3][2] =  17 &lt;- 0x0029FE94

a[0][0][3][3] =  18 &lt;- 0x0029FE95       a[0][0][3][4] =  19 &lt;- 0x0029FE96       a[0][1][0][0] =  20 &lt;- 0x0029FE97

a[0][1][0][1] =  21 &lt;- 0x0029FE98       a[0][1][0][2] =  22 &lt;- 0x0029FE99       a[0][1][0][3] =  23 &lt;- 0x0029FE9A

a[0][1][0][4] =  24 &lt;- 0x0029FE9B       a[0][1][1][0] =  25 &lt;- 0x0029FE9C       a[0][1][1][1] =  26 &lt;- 0x0029FE9D

a[0][1][1][2] =  27 &lt;- 0x0029FE9E       a[0][1][1][3] =  28 &lt;- 0x0029FE9F       a[0][1][1][4] =  29 &lt;- 0x0029FEA0

a[0][1][2][0] =  30 &lt;- 0x0029FEA1       a[0][1][2][1] =  31 &lt;- 0x0029FEA2       a[0][1][2][2] =  32 &lt;- 0x0029FEA3

a[0][1][2][3] =  33 &lt;- 0x0029FEA4       a[0][1][2][4] =  34 &lt;- 0x0029FEA5       a[0][1][3][0] =  35 &lt;- 0x0029FEA6

a[0][1][3][1] =  36 &lt;- 0x0029FEA7       a[0][1][3][2] =  37 &lt;- 0x0029FEA8       a[0][1][3][3] =  38 &lt;- 0x0029FEA9

a[0][1][3][4] =  39 &lt;- 0x0029FEAA       a[0][2][0][0] =  40 &lt;- 0x0029FEAB       a[0][2][0][1] =  41 &lt;- 0x0029FEAC

a[0][2][0][2] =  42 &lt;- 0x0029FEAD       a[0][2][0][3] =  43 &lt;- 0x0029FEAE       a[0][2][0][4] =  44 &lt;- 0x0029FEAF

a[0][2][1][0] =  45 &lt;- 0x0029FEB0       a[0][2][1][1] =  46 &lt;- 0x0029FEB1       a[0][2][1][2] =  47 &lt;- 0x0029FEB2

a[0][2][1][3] =  48 &lt;- 0x0029FEB3       a[0][2][1][4] =  49 &lt;- 0x0029FEB4       a[0][2][2][0] =  50 &lt;- 0x0029FEB5

a[0][2][2][1] =  51 &lt;- 0x0029FEB6       a[0][2][2][2] =  52 &lt;- 0x0029FEB7       a[0][2][2][3] =  53 &lt;- 0x0029FEB8

a[0][2][2][4] =  54 &lt;- 0x0029FEB9       a[0][2][3][0] =  55 &lt;- 0x0029FEBA       a[0][2][3][1] =  56 &lt;- 0x0029FEBB

a[0][2][3][2] =  57 &lt;- 0x0029FEBC       a[0][2][3][3] =  58 &lt;- 0x0029FEBD       a[0][2][3][4] =  59 &lt;- 0x0029FEBE

a[1][0][0][0] =  60 &lt;- 0x0029FEBF       a[1][0][0][1] =  61 &lt;- 0x0029FEC0       a[1][0][0][2] =  62 &lt;- 0x0029FEC1

a[1][0][0][3] =  63 &lt;- 0x0029FEC2       a[1][0][0][4] =  64 &lt;- 0x0029FEC3       a[1][0][1][0] =  65 &lt;- 0x0029FEC4

a[1][0][1][1] =  66 &lt;- 0x0029FEC5       a[1][0][1][2] =  67 &lt;- 0x0029FEC6       a[1][0][1][3] =  68 &lt;- 0x0029FEC7

a[1][0][1][4] =  69 &lt;- 0x0029FEC8       a[1][0][2][0] =  70 &lt;- 0x0029FEC9       a[1][0][2][1] =  71 &lt;- 0x0029FECA

a[1][0][2][2] =  72 &lt;- 0x0029FECB       a[1][0][2][3] =  73 &lt;- 0x0029FECC       a[1][0][2][4] =  74 &lt;- 0x0029FECD

a[1][0][3][0] =  75 &lt;- 0x0029FECE       a[1][0][3][1] =  76 &lt;- 0x0029FECF       a[1][0][3][2] =  77 &lt;- 0x0029FED0

a[1][0][3][3] =  78 &lt;- 0x0029FED1       a[1][0][3][4] =  79 &lt;- 0x0029FED2       a[1][1][0][0] =  80 &lt;- 0x0029FED3

a[1][1][0][1] =  81 &lt;- 0x0029FED4       a[1][1][0][2] =  82 &lt;- 0x0029FED5       a[1][1][0][3] =  83 &lt;- 0x0029FED6

a[1][1][0][4] =  84 &lt;- 0x0029FED7       a[1][1][1][0] =  85 &lt;- 0x0029FED8       a[1][1][1][1] =  86 &lt;- 0x0029FED9

a[1][1][1][2] =  87 &lt;- 0x0029FEDA       a[1][1][1][3] =  88 &lt;- 0x0029FEDB       a[1][1][1][4] =  89 &lt;- 0x0029FEDC

a[1][1][2][0] =  90 &lt;- 0x0029FEDD       a[1][1][2][1] =  91 &lt;- 0x0029FEDE       a[1][1][2][2] =  92 &lt;- 0x0029FEDF

a[1][1][2][3] =  93 &lt;- 0x0029FEE0       a[1][1][2][4] =  94 &lt;- 0x0029FEE1       a[1][1][3][0] =  95 &lt;- 0x0029FEE2

a[1][1][3][1] =  96 &lt;- 0x0029FEE3       a[1][1][3][2] =  97 &lt;- 0x0029FEE4       a[1][1][3][3] =  98 &lt;- 0x0029FEE5

a[1][1][3][4] =  99 &lt;- 0x0029FEE6       a[1][2][0][0] = 100 &lt;- 0x0029FEE7       a[1][2][0][1] = 101 &lt;- 0x0029FEE8

a[1][2][0][2] = 102 &lt;- 0x0029FEE9       a[1][2][0][3] = 103 &lt;- 0x0029FEEA       a[1][2][0][4] = 104 &lt;- 0x0029FEEB

a[1][2][1][0] = 105 &lt;- 0x0029FEEC       a[1][2][1][1] = 106 &lt;- 0x0029FEED       a[1][2][1][2] = 107 &lt;- 0x0029FEEE

a[1][2][1][3] = 108 &lt;- 0x0029FEEF       a[1][2][1][4] = 109 &lt;- 0x0029FEF0       a[1][2][2][0] = 110 &lt;- 0x0029FEF1

a[1][2][2][1] = 111 &lt;- 0x0029FEF2       a[1][2][2][2] = 112 &lt;- 0x0029FEF3       a[1][2][2][3] = 113 &lt;- 0x0029FEF4

a[1][2][2][4] = 114 &lt;- 0x0029FEF5       a[1][2][3][0] = 115 &lt;- 0x0029FEF6       a[1][2][3][1] = 116 &lt;- 0x0029FEF7

a[1][2][3][2] = 117 &lt;- 0x0029FEF8       a[1][2][3][3] = 118 &lt;- 0x0029FEF9       a[1][2][3][4] = 119 &lt;- 0x0029FEFA

(((*(a + 1) + 2) + 3) + 4)    -   0x0029FF73   =   a[1][9]
((*(*(a + 1) + 2) + 3) + 4)   -   0x0029FF0A   =   a[1][2][7]
(*(*(*(a + 1) + 2) + 3) + 4)  -   0x0029FEFA   =   &amp;a[1][2][3][4]
*(*(*(*(a + 1) + 2) + 3) + 4) -   119          =   a[1][2][3][4]
((((a + 1) + 2) + 3) + 4)     -   0x002A00DB   =   a[10]
(((a + 1 + 2) + 3) + 4)       -   0x002A00DB   =   a[10]
((a + 1 + 2 + 3) + 4)         -   0x002A00DB   =   a[10]
(a + 1 + 2 + 3 + 4)           -   0x002A00DB   =   a[10]
Hello world!

Process returned 0 (0x0)   execution time : 0.195 s
Press any key to continue.

显然,当数组标号超过定义时,此时表示的是按照原格式所指向的地址,如a[1][9],a[1][2][7]等

在定义范围内时,表示的是数值,如a[1][2][3][4]等

  • ( a + 1 ) 是地址,指向a[1][0][0][0]的地址

( ( a + 1 ) + 2 ) 是地址,指向a[1][2][0][0]的地址

……

以此类推…

欢迎赞赏