如何确定由*(arr + i)[1]和**(arr + i)表示的元素?

1 c arrays pointers

我不明白如何确定以下要素:

  1. *(arr+1)[1] -打印7。

  2. **(arr+1) -打印4。

#include <stdio.h>
int main()
{
    int arr[3][3]={1,2,3,4,5,6,7,8,9};
    printf("%d %d",*(arr+1)[1],**(arr+1));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

mel*_*ene 5

根据定义,a[b]等效于*(a + b)

[](后缀)的优先级高于*(前缀),因此*a[b]解析为*(a[b])

  1. *(arr+1)[1]解析为*((arr+1)[1])

    *((arr+1)[1])等同于*(*(arr+1+1))

    *(*(arr+1+1))减少到**(arr+2)

    **(arr+2)等同于*(arr[2])

    *(arr[2])等同于*(arr[2]+0)

    *(arr[2]+0)等同于arr[2][0]

  2. **(arr+1)等同于*(arr[1])

    *(arr[1])等同于*(arr[1]+0)

    *(arr[1]+0)等同于arr[1][0]

至于实际数据:

int arr[3][3]={1,2,3,4,5,6,7,8,9};
Run Code Online (Sandbox Code Playgroud)

有点难读。更好:

int arr[3][3]={
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,arr[2][0]为您提供7第三个子数组()的第一个元素(),7,8,9在第二种情况下,arr[1][0]为您提供4第二个子数组()的第一个元素(4,5,6)。