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

C 如何确定由*(arr+;i)[1]和**(arr+;i)表示的元素?,c,arrays,pointers,C,Arrays,Pointers,我无法理解以下因素是如何确定的: *(arr+1)[1]-7已打印 **(arr+1)-4已打印 #包括 int main() { int arr[3][3]={1,2,3,4,5,6,7,8,9}; printf(“%d%d”,*(arr+1)[1],**(arr+1)); 返回0; } arr可以更直观地写成这样: int arr[3][3]={ {1,2,3}, {4,5,6}, {7,8,9}, }; *(arr+1)[1]相当于*(arr+2),因为

我无法理解以下因素是如何确定的:

  • *(arr+1)[1]
    -7已打印

  • **(arr+1)
    -4已打印

  • #包括
    int main()
    {
    int arr[3][3]={1,2,3,4,5,6,7,8,9};
    printf(“%d%d”,*(arr+1)[1],**(arr+1));
    返回0;
    }
    
    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)
    的工作原理相同。

    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)
    的工作原理相同。

    根据定义,
    a[b]
    相当于
    *(a+b)

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

  • *(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]

  • **(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,8,9
    )的第一个元素(
    7
    ),而在第二种情况下,
    arr[1][0]
    为您提供第二个子数组(
    4,5,6
    )的第一个元素(
    4,5,6
    )。根据定义,
    a[b]/code>相当于
    *(a+b)

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

  • *(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]

  • **(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,8,9
    )的第一个元素(
    7
    ),而在第二种情况下,
    arr[1][0]
    为您提供第二个子阵列(
    4,5,6
    )的第一个元素(
    4
    )。

    “可以”?应该是!“直觉上”?正确地“可能”?应该是!“直觉上”?正确地