各位朋友,
代码如下:
int main()
{
int a[4][5] = {{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20}};
int (*p)[5];
p = a;
for(int i = 0; i < 4; i++)
{
p = a + i; //当改为 p = p + i 时,输出有误。
for(int j = 0; j < 5; j++)
{
cout<<*(*p + j)<<" ";
}
cout<<endl;
}
}
在我的电脑上,用eclipse编译,正常输出结果为:
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
当将p = a + i; //当改为 p = p + i 时,输出有误,输出结果为:
1 2 3 4 5
6 7 8 9 10
16 17 18 19 20
4198585 1 8065296 8067040 -1
这是为什么呀?
4 个解决方案
a是个固定值,而p是不断变化的
p = a+i; 和 p = p+i;显然不是一回事
p = p + i已经把p改变了,而a是不变的。
p = p + i第一次相当于p = a + i;
p = p + i第二次,相当于p = p + i + i
p = p + i第三次,相当于p = p + i + i + i;
……
纠正一个概念:a是二维数,但p不是,p是“指向一维数组的指针”。C允许用指针来访问数组,但指针不是数组。
用指针来访问数组时,可以用访问数组的方法:
p = p + i这句去掉,然后输出语句改为:
cout<<p[i][j]<<" ";
也可以用指针的迭代功能:
p = p + i 改为p = p + 1或p ++,后面不变。
第一个是正确的,但是把p=a+i;改成p=p+i时显然就不正确了,因为p也在不断地变化,每次的p比上次大1,所以再在p的基础上+i肯定就会往后移了。
傻了,原来是当改为 p = p + i 时,实际上加了多次。