【问题标题】:C Array Pointer NotationC 数组指针表示法
【发布时间】:2022-10-07 21:20:17
【问题描述】:

我对以下代码的问题:

int main() {
    int i = 0;
    int array[2][2] = { {1,2} , {3,4}};
    for(int j = 0; j<2; j++) {
        for(int k = 0; k < 2;k++) {
            printf("%d", *(*(*(array+i)+j)+k));
        }
        printf("\n");
    }
}

为什么这不起作用?

我的想法:我有第 i^th 2d 数组(这是 0,因为我只有一个 2d 数组),然后是第 i^th 2d 数组的第 j^th 1d 数组,所以 j 的第 k^th 元素第 i 个 ^th 二维数组的 ^th 1d 数组。

【问题讨论】:

  • 你有一个二维数组。通过sa = *(array + i),您将获得第 i 个一维子数组。通过e = *(sa + j),您可以获得前一维子数组的第 j 个元素。在您的情况下元素eint 类型,因此在添加k 后您不能再次取消引用。请记住,*(array + i) 类似于 array[i]。对于 N 维数组,您将在 N 取消引用后到达基本元素。

标签: c for-loop multidimensional-array implicit-conversion pointer-arithmetic


【解决方案1】:

表达式中使用的数组(极少数例外)被隐式转换为指向其第一个元素的指针。

来自 C 标准(6.3.2.1 左值、数组和函数指示符)

3 除非它是 sizeof 运算符的操作数或一元 & 运算符,或者是用于初始化数组的字符串文字, 具有“类型数组”类型的表达式被转换为 类型为“pointer to type”的表达式,指向初始 数组对象的元素并且不是左值。如果数组对象 具有注册存储类,行为未定义。

您有以下二维数组

int array[2][2] = { {1,2} , {3,4}};

数组的元素又是int[2] 类型的一维数组。

因此,在调用printf 时使用的数组指示符被转换为指向int( * )[2] 类型的第一个元素(行)的指针。

要使用指针算法获取指向数组第 i 行的指针,您应该编写

array + i

如前所述,表达式的类型为int ( * )[2]

取消引用指针表达式

*( array + i ) 

你会得到它的第 i 行,它是一个 int[2] 类型的数组,它又被转换为指向它的第一个元素的 int * 类型的指针。

要使用指针算法获取指向行的第 j 个元素的指针,您应该编写

*( array + i ) + j

该表达式的类型为int *

因此,要获取指针表达式指向的元素,您需要像取消引用它一样

*( *( array + i ) + j )

因此嵌套的 for 循环看起来像

for( int i = 0; i < 2; i++) 
{
    for ( int j = 0; j < 2; j++ ) 
    {
        printf("%d", *( *( array + i )+j ) );
    }
    printf("
");
}

【讨论】:

    【解决方案2】:

    *(array + i) 给你i'th一维数组,而不是 i'th 二维数组。

    表达式*(array + i) 的类型为int [2],衰减为int *。因此,表达式*(*(array + i) + j) 的类型为int,不能进一步取消引用。记住,如果

    a[i] == *(a + i)
    

    然后

    a[i][j] == *(a[i] + j) == *(*(a + i) + j)
    

    a[i][j][k] ==
    *(a[i][j] + k) ==
    *(*(a[i] + j) + k) ==
    *(*(*(a + i) + j) + k)
    

    等等

    为了您和其他人的理智,只需使用数组下标表示法。像这样的练习有助于理解数组下标在 C 中的实际工作方式,但下标表示法更简洁,而且您不太可能犯错误。

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 1970-01-01
      • 2011-08-27
      • 2021-02-20
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多