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

C语言指针算术访问二维数组异常,与[]方式结果不一致

为什么*(*array+j)+i替代array[j][i]结果不对?

先理清二维数组的指针访问逻辑:

  • 假设你用的是int array[size][size]这种二维数组,array本身是指向第一个一维子数组的指针。array + j指向第j个一维子数组,*(array + j)就等价于array[j]——也就是第j个子数组的首地址。
  • 要拿到array[j][i]的值,得先定位到第j个子数组的首地址*(array + j),再往后偏移i个int元素的位置(即*(array + j) + i),最后解引用这个地址,也就是*( *(array + j) + i ),这才是array[j][i]的等价指针写法。

你写的*(*array+j)+i完全是另一个逻辑:

  • *array是第一个子数组的首地址(array[0]),*array + j是array[0][j]的内存地址,解引用后*(*array + j)就是array[0][j]的数值,最后加i变成了array[0][j] + i——这是把第一个子数组里的元素值和i做加法,和array[j][i]不是一回事,结果当然不一样。

修正后的第二个循环代码:

for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
        int num = *( *(array + j) + i ); // 这才是array[j][i]的等价写法
        //无关代码
    }
}

顺带提一句:你第一个循环里的*(*array+i)+j对应的是array[0][i] + j,如果你的业务逻辑本来就要这个值,那没问题;但如果是想访问array[i][j],那第一个循环的写法也错了,应该改成*( *(array + i) + j )。

内容的提问来源于stack exchange,提问作者Vshastra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:35:23