You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用指针为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:36:15