对C/C++中多维数组指针的理解

#include "stdafx.h"
#include "stdio.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; /* 定义一个3行4列的二维数组 */
    int*p;
    printf("%d %d/n",a,*a);
    printf("%d %d/n",a[0],*(a+0));
    printf("%d %d/n",&a[0],&a[0][0]);
    printf("%d %d/n",a[0][0],*(*(a+0)+0));

    printf("%d %d/n",a,*a);
    printf("%d %d/n",*a[1],*(a+1));
    printf("%d %d/n",&a[1],&a[1][1]);
    printf("%d %d/n",a[1][1],*(*(a+1)+1));

    for(p=a[0];p<a[0]+12;p++)
    {
        if((p-a[0])%4==0) /* 利用整数指针变量p减去当前地址判断出是不是已经显示出了四个值,换行回车 */
        {
            printf("/n");
        }
        printf("%4d",*p); /* 打印出元素的值 */
    }
    printf("/n");
}


/*
对于多维数组的理解比较困难,这也是由于和一维数组指针含义有冲突造成的,例如第5行中的a和*a打印出来的值,
就会让人弄不明白我们知道数组传递的地址那么a表示这个数组的其实地址为什么*a却不是实际值呢?原因是在多维
数组中a+0表示的是第0行的首地址,a+1表示是第一行的首地址,那么*a其实就是*(a+0),那么第一个元素其实是a[0][0]
而*(a+0)仅仅是把一个3行4列的二维数组拆为了三个一维数组,*(a+0)显然表示的不是物理位置也就不可能得到第一个
元素的值了,它仅仅是一个内存地址也就是第0行的启始地址,再看8行中的*(*(a+0)+0),它表示的则是第0行第0列个元素
的值也就是a[0][0],再次强调*(a+0)表示的是数组第一行的首地址,也就是第二行的*(a+1),而元素值要得到显然就是
*(*(a+0)+0)了如果是第0行第1个也就是*(*(a+0)+1),对于多维数指针的理解是个比较难需要反复观察联系的地方需要谨慎
如果多维数组的概念不清楚就需要从前面学起注意知识的积累!
*/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值