关于三维数组和指针的测试

#include <stdio.h>

int main(void)
{
    int i = 0;
    int j = 0;
    int k = 0;
    //int a[2][3][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24};
    //用下面的表示看起来比较直接对得上
    int a[2][3][4] = {  {               //a[0]  
                            {           //a[0][0]
                                1,      //a[0][0][0]  0xbfd3d210
                                2,      //a[0][0][1]  0xbfd3d214  
                                3,      //a[0][0][2]  0xbfd3d218  
                                4       //a[0][0][3]  0xbfd3d21c  
                            },          
                            {           //a[0][1]
                                5,      //a[0][1][0] 0xbfd3d220
                                6,      //a[0][1][1] 0xbfd3d224
                                7,      //a[0][1][2] 0xbfd3d228
                                8       //a[0][1][3] 0xbfd3d22c
                            },          
                            {           //a[0][2]
                                9,      //a[0][2][0] 0xbfd3d230
                                10,     //a[0][2][1] 0xbfd3d234
                                11,     //a[0][2][2] 0xbfd3d238
                                12      //a[0][2][3] 0xbfd3d23c
                            }           
                        },                   
                        {               //a[1]
                            {           //a[1][0]
                                13,     //a[1][0][0] 0xbfd3d240
                                14,     //a[1][0][1] 0xbfd3d244
                                15,     //a[1][0][2] 0xbfd3d248
                                16      //a[1][0][3] 0xbfd3d24c
                            },          
                            {           //a[1][1]
                                17,     //a[1][1][0] 0xbfd3d250
                                18,     //a[1][1][1] 0xbfd3d254
                                19,     //a[1][1][2] 0xbfd3d258
                                20      //a[1][1][3] 0xbfd3d25c
                            },          
                            {           //a[1][2]
                                21,     //a[1][2][0] 0xbfd3d260
                                22,     //a[1][2][1] 0xbfd3d264
                                23,     //a[1][2][2] 0xbfd3d268
                                24      //a[1][2][3] 0xbfd3d26c~0xbfd3d26f
                            }                         //下一个就是0xbfd3d270
                        }               
                     };
    for(i=0; i<2; i++)
    {
        for(j=0; j<3; j++)
        {
            for(k=0; k<4; k++)
            {
                printf("a[%d][%d][%d]:%p\n",i,j,k,&a[i][j][k]);
            }
        }
    }
    printf("a[1][2][3]:%p\n",&a[i-1][j-1][k-1]+1);  //打印a[1][2][3]元素的尾地址的下一个地址0xbfd3d270.

    printf("\na    = %p\n",a);        //a表示数组a[2]首元素a[0]的首地址
    printf("a+1  = %p\n\n",a+1);      //表示数组a[2]第二个元素a[1]的首地址
    
    int (*p0)[3][4] = a;              //a[0]中有三个元素,每个元素又有4个元素,所以对应数组[3][4]
    printf("p0  = %p\n",p0);          //p0是指向a[0]或a[1]类型的

        p0 = &a[0];                   //赋值没问题,说明类型一致,值相同所以就说明a就是
                                      //首元素a[0]首地址,a和&a[0]都指向元素a[0]

    printf("p0  = %p\n\n",p0);
    printf("p0+1  = %p\n\n",p0+1);    //p0+1就指向a[1]了.

    
    int (*p)[2][3][4] = &a;           //取a的地址就相当于整个三维数组的首地址
    printf("p = %p\n", p);
    printf("p+1 = %p\n\n", p+1);      //加1就相当于指针跑到a[1][2][3]地址的后面,超过了数组越界了.

    int *p1 = a[0][0];                //a[0][0]是首元素a[0][0][0]的首地址.指向a[0][0][0]
    int *p2 = a[1][0];                //a[1][0]是首元素a[1][0][0]的首地址.指向a[1][0][0]
    printf("p1 = %p\n", p1);
    printf("p1+1 = %p\n", p1+1);      //+1              指向a[0][0][1]
    printf("p1+3 = %p\n\n", p1+3);    //+3              指向a[0][0][3]

    printf("p2 = %p\n", p2);          //a[1][0]是首元素a[1][0][0]的首地址.指向a[1][0][0]
    printf("*p1 = %d\n", *p1); 
    printf("*p2 = %d\n", *p2);
    printf("*(p1+19) = %d\n", *(p1+19));    //从a[0][0][0]开始数19个元素,得到a[1][1][3]
    printf("*(p2+2) = %d\n", *(p2+2));      //从a[1][0][0]开始数2个元素,得到a[1][0][2]
    printf("*(a[0][0]+18) = %d\n", *(a[0][0]+18));  //从a[0][0][0]开始数18个元素,得到a[1][1][2]

    int (*p3)[4] = &a[0][0];            //p3是指向元素a[0][0],它包含4个int的元素
    printf("p3 = %p\n", p3);
    printf("p3+3 = %p\n", p3+3);        //+3等于向下移动3*4个int那么多个地址,所以指向a[1][0]

    printf("a[1][2][2]=%d\n",a[1][2][2]);
    printf("a[1][2][3]=%d\n",a[1][2][3]);
    
/*  int a[2][6] = { {1,2,3,4,5,6} , {7,8,9,10,11,12} };
    int (*p)[6];

    p = a;
    p = &a[0];    

    printf("a[2][6] = { {1,2,3,4,5,6} , {7,8,9,10,11,12} }\n");
    printf("a[0][3]=%d   *(*(p+0)+3)\n", *(*(p+0)+3));
    printf("a[1][3]=%d   *(*(p+1)+3)\n", *(*(p+1)+3));
    printf("p+0=%p   *(p+0)\n", *(p+0));
    printf("p+1=%p   *(p+1)\n", *(p+1));

    int *p1 = a[0];
    int *p2 = &a[0][0];     //a[0]等同于&a[0][0]
    
    printf("a[0][3]=%d   *(p2+6)\n", *(p2+6));

     printf("a[0]+2=%d   *(a[0]+2)\n", *(a[0]+2));

    int *p3 = a[1];
    printf("a[1][2]=%d   *(p3+2)\n", *(p3+2));
*/
    return 0;
}


注: 模型图片的地址不是同一次编译的,所以和运行结果不同,但元素之间相差的地址是一样的.

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值