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