C 数组和指针算法~需要澄清
我正在做一些关于数组和指针的实验:C 数组和指针算法~需要澄清,c,arrays,pointers,multidimensional-array,pointer-arithmetic,C,Arrays,Pointers,Multidimensional Array,Pointer Arithmetic,我正在做一些关于数组和指针的实验: 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 ("*
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]);
输出为:
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
我理解1、2、4、5、6、8和9的输出。但我不理解3和7的输出。为什么输出是
7
?因为运算符[]
的优先级高于运算符*
,下面的表达式是:
int x = *(a + i)[j];
等于:
int* p = (a + i)[j];
int x = *p;
int* p = ((a + i) + j);
int x = *p;
int (*p0)[3] = (a + i);
int* p = (p0 + j);
int x = *p;
int y = *(a[i] + j);
这也等于:
int* p = (a + i)[j];
int x = *p;
int* p = ((a + i) + j);
int x = *p;
int (*p0)[3] = (a + i);
int* p = (p0 + j);
int x = *p;
int y = *(a[i] + j);
在这种情况下,其等于:
int* p = (a + i)[j];
int x = *p;
int* p = ((a + i) + j);
int x = *p;
int (*p0)[3] = (a + i);
int* p = (p0 + j);
int x = *p;
int y = *(a[i] + j);
这意味着i
和j
最终将第一个索引p
移动到元素a[2][0]
,其值为7
而
[]
和*
运算符的优先级与表达式的求值有什么关系?使用()
进行简单测试,确保首先对*
进行评估,在这里就足够了。这意味着:
int y = (*(a + i))[j];
等于:
int* p = (a + i)[j];
int x = *p;
int* p = ((a + i) + j);
int x = *p;
int (*p0)[3] = (a + i);
int* p = (p0 + j);
int x = *p;
int y = *(a[i] + j);
这很简单:
int y = a[i][j];
假设
a+i
isb
+--------------a+0---> {1, 2, 3,
| a+1---> 4, 5, 6,
| a+2---> 7, 8, 9};
|
*(a + i)[j] = *(*(b+j)) = *(*(b+1)+1)
= *(*(b+2))
= *(*(a+2))
= **(a+2)
= a[2][0]
= 7
int(*p)[3];//是指向3个整数的数组的指针
什么时候
p=a
相同的场景,类似于使用b
阅读本手册第6节。
+--------------a+0---> {1, 2, 3,
| a+1---> 4, 5, 6,
| a+2---> 7, 8, 9};
|
*(a + i)[j] = *(*(b+j)) = *(*(b+1)+1)
= *(*(b+2))
= *(*(a+2))
= **(a+2)
= a[2][0]
= 7