二维数组的指针

昨天写好一个程序以后,编译通过但是结果怎么都不对,单步跟踪发现是某个二维数组的指针在引用时出了问题,但是看了好久看不出名堂来,于是把这块抽了出来,单建立了一个工程来试验。

是这么声明的:

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

               //     p->    1        2         3

              //    q->      4         5        6

              //                7         8        9

             //                  10      11      12

int   (*p)[3]=a ;

那么 *(p+1)[1] 的值是多少呢,我想当然的以为p应该指向第二行的第二列,就是5,但是结果却很意外的显示的是7

为啥呢?这里,p是一个指向一个长度为3的一维数组的指针,就是说,对p的所有增减操作都是以一行(三个int)来进行的,那么p+1这个操作显然是让p移动到了下一行(下一个一维数组的第一个单元),假设int (*q)[3]=p+1,那刚才那个表达式便成了*q[1]的值。这时候看出来跟声明有些不同,*q外边少了一个括号。由于[ ]的优先级是最高的,q便和[ ]先结合了,因为q是一个指针,那么 q[1]无条件的等于 *(q+1),这下指向又增加了一行,指向了第三行,那么*q[1]实际上等于*(*(q+1)),就成了第三行第一列的值。

翻了半天书,今儿个总算是把二维数组的指针折腾清了,那个程序最后也终于通过了,最后再把试验过程中写下的代码贴在下面:

#include <iostream>

using namespace std;

int main()
{
 int a[4][3]={1,2,3,4,5,6,7,8,9,0,11,12};
 int (*p)[3]=a;

 cout<<*(p+1)[0]<<endl;
 cout<<*(p+2)[0]<<endl;
 cout<<*(p+1)[1]<<endl;
 cout<<(*(p+1))[1]<<endl;

 cout<<*(*(p+1)+1)<<endl;
 getchar();

 return 0;
}

这些语句的值以后不会再弄错了吧,恩。。应该是:

4

7

7

5

5

//VC++ 2008 express版本编译通过

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值