12

Я делаю некоторые эксперимент относительно массивов и указателей:массивы и арифметика указателей ~ разъяснения, необходимые

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?

+2

Read раздел 6 [FAQ] comp.lang.c (http://www.c-faq.com). –

ответ

10

Так как приоритет оператора [] выше оператора *, следующее выражение:

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; 

означает, что оба i и j в конечном счете перекладывать первый индекс делают p, чтобы указать на элемент a[2][0], значение которого является 7


А имеют приоритет [] и * операторов, чтобы сделать с оценка этого выражения? Простой тест с использованием (), чтобы убедиться, что сначала будет оценено *. Это означает, что это:

int y = (*(a + i))[j]; 

равно:

int y = *(a[i] + j); 

, который не что иное, как просто:

int y = a[i][j]; 
1

Позволяет сказать a+i является 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]; // Is pointer to array of 3 int s

Когда p=a же сценарий, аналогично использованию b