关于二维数组,为什么两个输出不一样?


各位朋友,
代码如下:
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 个解决方案

#1


a是个固定值,而p是不断变化的
p = a+i; 和 p = p+i;显然不是一回事

#2


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 ++,后面不变。

#3


第一个是正确的,但是把p=a+i;改成p=p+i时显然就不正确了,因为p也在不断地变化,每次的p比上次大1,所以再在p的基础上+i肯定就会往后移了。

#4


傻了,原来是当改为 p = p + i 时,实际上加了多次。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com