使用指针为C++二维数组赋值时输出结果异常的问题咨询
问题根因
你的指针版代码赋值逻辑存在偏移错误,第二行数组元素从未被正确赋值,输出的异常数值是栈内存中未初始化的随机残留值。
针对int A[2][3]这个二维数组,要明确指针偏移的对应规则:
A是数组指针,默认指向二维数组的第一行(即长度为3的一维数组A[0]),A + i才会偏移到第i行的起始位置*(A + i)等价于A[i],是第i行的首元素地址,在此基础上加j偏移,*(A + i) + j才是第i行j列元素的真实内存地址
你写的赋值语句*(*A + j) = 2*i + 3*j里,*A永远等价于A[0](第一行首地址),不管外层i循环取0还是1,赋值操作始终在修改第一行的元素,完全没有写入第二行对应的内存空间。
这也和你的输出现象完全匹配:i=0循环时,刚好给第一行三个元素赋了0、3、6,第一行输出正常;进入i=1循环后,你依旧在修改第一行的内存,第二行的内存从未被写入,保留了栈空间分配时的随机残留值,所以会出现32758这类无意义的数字。
另外你代码里定义了数组指针int (*p)[3] = A;但全程没有使用,属于冗余代码。
修正方案
只需要补全赋值语句里的行偏移i即可,修正后的完整代码如下:
int main(){ int A[2][3]; int (*p)[3] = A; for (int i=0; i<2; i++){ for(int j=0; j<3; j++){ // 补上行偏移i,指向第i行j列的元素地址 *(*(A + i) + j)= 2*i + 3*j; cout<<" "<<*(A[i]+j)<<" "; } cout<<endl; } return 0; }
如果要使用你提前定义的指针p,只需要把赋值语句里的A替换成p即可,逻辑完全一致:
*(*(p + i) + j) = 2*i + 3*j;
修正后运行就能得到和非指针版本完全一致的输出:
0 3 6 2 5 8
内容的提问来源于stack exchange,提问作者Thulitha Gurusinghe
相关产品推荐
相关产品推荐

