【问题标题】:Accessing 2d array with pointer arithmetic使用指针算法访问二维数组
【发布时间】:2016-01-01 14:50:05
【问题描述】:

我有一个数组 A[n][n] 我怎么可以这样访问它:*A+i*blockSize*dimenson?这不是翻译成A[i*blockSize*n]吗?

如果i*blockSize*n 是一个大于n 的数字,怎么会这样?我认为它可以工作,因为 C 中的二维数组实际上只是一块连续的内存。但是,这并不能改变我无法在没有运行时错误的情况下编写 A[i*blockSize*n][j] = something 的事实。

那么为什么*A+i*blockSize*dimenson 可以,但A[i*blockSize*n] 不行

我希望这个问题对 C 方面的专家有意义。

【问题讨论】:

    标签: c arrays pointer-arithmetic


    【解决方案1】:

    这不是转化为A[i * blockSize * n]

    不,你所拥有的不是1

    *A + i * blockSize * dimenson
    

    实际上等价于

    A[0] + i * blockSize * dimension
    

    你需要阅读operator precedence,正确的等价表达式是

    *(A + i * blockSize * dimenson)
    

    但这不是必需的,因为它会使代码更难阅读,而不会给您带来任何好处。


    1运算符请使用前后空格,以便于区分运算符和操作数。

    【讨论】:

      【解决方案2】:

      第一:

      *(A+i*blockSize*dimenson)
      

      翻译成:

      A[i*blockSize*dimenson]
      

      而你根本做不到:

      A[i*blockSize*n][j] = something
      

      如果i*blockSize*n 大于n,因为您将超出您分配的数组的范围,该数组的大小为n×n。

      但你可以这样做:

      A[i][j] 
      

      作为:

      B[i*n+j]
      

      如果将 B 声明为指向 A 的一维数组,例如:

      int A[n][n];
      int * B = (int *)A;
      

      【讨论】:

      • 如果你将B 声明为指向A 的一维数组 你会怎么做?而这个*(A + i * blockSize * dimenson) 不在发布的示例中。
      • 我只是添加了括号以清除运算符优先级,这与*A+i*blockSize*dimenson的示例相同。我还编辑了如何声明。
      • 不一样,请看我的回答。 * (dereference operator) 在表达式中涉及的所有运算符中具有最高优先级。此外,虽然第二部分在技术上是正确的(它会正常工作),但没有像 declare B 作为一维数组 pointingA 这样的东西。
      猜你喜欢
      • 2013-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      • 2021-11-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多