指针与二维数组的那些事儿

不可否认,这两天我被指针搞得头要炸了!!!思考思考思考!想出来了!应该是对的,所以写下理解过程。

话不多说,先上一段代码的部分:

int a[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};

int (*p)[4];
int i,j;

p = a;
for(i=0;i<3;i++){
        for(j=0;j<4;j++) printf("%3d\t",*(*(p+i)+j));
        printf("\n");
    }
首先,有一个int (*p)[4];它表示p是一个指针变量,指向包含四个元素的一维数组

也就是设有整型二维数组a[3][4]如下:
0  1  2   3
4  5  6   7
8  9 10 11

它的定义也可以写作

int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
C语言允许把一个二维数组分解为多个一维数组来处理。因此数组a可分解为3 个一维数组,即a[0],a[1],a[2]。每一个一维数组又含有4个(即列数)元素。
      

        所以:   a[3][4] = {a[0],a[1],a[2]};
                       a[0] = {0,1,2,3},a[1] = {4,5,6,7},a[2] = {8,9,10,11};

下面开始艰苦卓绝的分析~~


  p=a就是p指向第一个一维数组a[0];其值等于a,a[0]或&a[0][0],
  p+i 就指向一维数组a[i];
  而a[i]就是a[i][0]的地址哦~(这句相当重要,绕来绕去就是这一点没想明白)
  所以是指针指向了一个地址(地址指向地址)
*(p+i) 就是a[i]中第一个值的地址,即&a[i][0]
*(p+i)+j 就是a[i]中第j个值的地址,即&a[i][ j]
*((p+i)+j) 就是a[i]中第j个值,即第i行第j列这个数,即a[i][j]

综上,p是一个指向指针的的指针,哦天呐,我好晕!!!

文章写得并不长,但我想思考了很久才写清楚这些句子,至少对现阶段的我来说,这还是一个比较复杂东西,以后还是多多运用,多多体会,方能彻底掌握。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值