一个c++指针问题
void output(int *p)
{
for(int i=0;i<3;i++)
{
for(int j=0;j<4;j++)
{
//cout << "i=" << i << "j=" << j << endl;
cout << *((p+i)+j) << " ";
}
}
cout << endl;
}
void main()
{
int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
output(&a[0][0]);
}
为什么输出后是:1,3,5,7,3,5,7,9,5,7,9,11;
[解决办法]
- C/C++ code
当数组作为参数,就退化成了指针,所以你要自己计算它的维数#include "iostream"using namespace std;void output(int *p) { for(int i=0;i <3;i++) { for(int j=0;j <4;j++) { cout << *((p+i * 4)+j) << " "; // 这里 } } cout << endl; } void main() { int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23}; output(&a[0][0]); }
[解决办法]
你把这个二维数组按一维的形式排出来就是
1 3 5 7 9 11 13 15 17 19 21 23
在这个函数里
void output(int *p)
{
for(int i=0;i <3;i++)
{
for(int j=0;j <4;j++)
{
//cout < < "i=" < < i < < "j=" < < j < < endl;
cout<< *((p+i)+j)<< " ";
}
}
cout<<endl;
}
p = 0 (意指p指向第0个元素,并非真的为0)
第一次外循环 ,i=0,p=0,因此p+i+j = j,所以cout语句等价于 cout<<*([0])到cout<<([3]),输出1 3 5 7
第二次外循环,i =1,p=0,因此p+i+j = j+1,所以输出语句等价于 cout<<*([1])到 cout<<([4]), 输出 3 5 7 9
第三次外循环是一样的道理,关键是多维数组在内存里还是以线性的方式存储的,它通过一个映射函数进行[][]到[]的转换
以上是小弟的拙见,请斧正。