我不明白如何确定以下元素:
*(arr+1)[1]
-已打印7。
**(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;
}
答案 0 :(得分:5)
根据定义,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
)的第一个元素(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)
的工作方式相同。