数组和指针算术〜需要澄清

use*_*159 12 c arrays pointers pointer-arithmetic multidimensional-array

我正在做一些关于数组和指针的实验:

int a[3][3] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int i = 1, j = 1;
int (*p)[3];

p = a;
printf ("*(*(a + i) + j) = %d\n", *(*(a + i) + j));
printf ("*(a[i] + j) = %d\n", *(a[i] + j));
printf ("*(a + i)[j] = %d\n", *(a + i)[j]);
printf ("*(a + 3 * i + j) = %p\n", *(a + 3 * i + j));
printf ("*(*(p + i) + j) = %d\n", *(*(p + i) + j));
printf ("*(p[i] + j) = %d\n", *(p[i] + j));
printf ("*(p + i)[j] = %d\n", *(p + i)[j]);
printf ("*(p + 3 * i + j) = %p\n", *(p + 3 * i + j));
printf ("p[i][j] = %d\n", p[i][j]);
Run Code Online (Sandbox Code Playgroud)

输出是:

1. *(*(a + i) + j) = 5
2. *(a[i] + j) = 5
3. *(a + i)[j] = 7
4. *(a + 3 * i + j) = 0x7fff5e0e5b94
5. *(*(p + i) + j) = 5
6. *(p[i] + j) = 5
7. *(p + i)[j] = 7
8. *(p + 3 * i + j) = 0x7fff5e0e5b94
9. p[i][j] = 5
Run Code Online (Sandbox Code Playgroud)

我理解1,2,4,5,6,8和9的输出.但我不明白3和7
的输出.为什么输出7

Lih*_*ihO 10

由于运算符的优先级[]高于运算符*,因此以下表达式:

int x = *(a + i)[j];
Run Code Online (Sandbox Code Playgroud)

等于:

int* p = (a + i)[j];
int  x = *p;
Run Code Online (Sandbox Code Playgroud)

这也等于:

int* p = ((a + i) + j);
int  x = *p;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它等于:

int  (*p0)[3]  = (a + i);
int*  p        = (p0 + j);
int   x = *p;
Run Code Online (Sandbox Code Playgroud)

意味着两者ij最终将第一个索引转换p为指向元素a[2][0],其值为7


对于这个表达式的评估,优先级[]*运算符有什么优势?通过使用()来确保*首先评估的简单测试就足够了.这意味着:

int y = (*(a + i))[j];
Run Code Online (Sandbox Code Playgroud)

等于:

int y = *(a[i] + j);
Run Code Online (Sandbox Code Playgroud)

这简直就是:

int y = a[i][j];
Run Code Online (Sandbox Code Playgroud)