2 Разыменование массивов измерений, как оценивать с помощью указателей - PullRequest
1 голос
/ 02 октября 2011
a[2][3] = {{-3,14,5},{1,-10,8}}

*(a[j]+k) 
*(a[j+k-2]) 
(*(a+j))[k]) 

(*(a+k-1))[j] 
*((*(a+j))+k)) 

(**(a+j)+k) 
*(&a[0][0]+j+k) 

когда я печатаю эти данные, я получаю вывод: 8 1 8 -10 8 3 1 соответственно. Если кто-то может объяснить подробно, как поступают значения, я новичок, прошу прощения за плохое форматирование здесь, а такжебеспокоят вас такой большой работой:)

1 Ответ

0 голосов
/ 02 октября 2011

Я предполагаю, что j == 1 и k == 2:

*(a[j]+k) == *(a[1]+2) :

    a[1] = {1, -10, 8};
    So a[1]+2 is a pointer to 8, and *(a[1]+2) == 8

*(a[j+k-2]) == *(a[1+2-2]) == *(a[1]):

    a[1] = {1, -10, 8}
    Since *a[1] is the value of the first element in a[1], the expression evaluates to 1

(*(a+j))[k] == (*(a+1))[2]:

    a+1 is a pointer to the second element in a, so *(a+1) == a[1] = {1, -10, 8}
    a[1][2] == 8

(*(a+k-1))[j]  == (*(a+2-1))[1] == (*(a+1))[1]:

    *(a+1) == a[1] (see the last answer)
    a[1][1] == -10

*((*(a+j))+k) == *((*(a+1))+2):

     *(a+1) == a[1], so the expressions is equivalent to *(a[1]+2)
     *(a[1]+2) is equivalent to a[1][2] for the same reasoning as above, which is 8

(**(a+j)+k)  == (**(a+1)+2):

    *(a+1) = a[1]
   **(a+1) = a[1][0] == 1
     Adding 2 to that gives 3

*(&a[0][0]+j+k) == *(&a[0][0]+1+2) == *(&a[0][0]+3):

    &a[0][0] == a[0]
    *(a[0]+3) == a[0][3];

Этот последний возвращает 1, потому что он расширяется в памяти после конца [0] в [1], и вы получаете [1] [0]. Я думаю, что это поведение на самом деле не определено, хотя. Это зависит от того, гарантирует ли стандарт C, что инициализированный 2D-массив будет последовательно размещаться в памяти или нет, что может привести к ошибке сегментации или к худшему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...