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

时间:2019-04-07 07:25:02

标签: 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;
}

2 个答案:

答案 0 :(得分: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};

有点难以阅读。更好:

int arr[3][3]={
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

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

答案 1 :(得分:1)

arr可以更直观地写成这样:

 int arr[3][3]={
     {1,2,3},
     {4,5,6},
     {7,8,9},
 };

*(arr+1)[1]等效于**(arr+2),因为a[n]等效于*(a+n)arr+2跳过两行,提供指向{{7,8,9}}的指针,然后两颗星取消引用这些值中的第一个。

**(arr+1)的工作方式相同。