Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组和指针算法~需要澄清_C_Arrays_Pointers_Multidimensional Array_Pointer Arithmetic - Fatal编程技术网

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
is
b

                        +--------------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