2015-04-09 3 views
1
int main() 
{ 
    int a[3][4]={1,2,3,4,4,3,2,1,1,3,4,1}; 
    printf("\n%d", (a+1)); 
    printf("\n%d", *(a+1)); 
    printf("\n%d", (a+1)+2); 
    printf("\n%d", *(a+1)+2); 
    printf("\n%d",*(*(a+1)+2)); 
} 

Почему у нас есть адреса, несмотря на уважение во всех, кроме последнего?Указатели на различие в c

Кроме того, согласно моему уровню понимания

a+1 = 1st position of array 

*(a+1) = value at first position 2 в т.е. данном случае

*(a+1) + 2 = 4th position in array 

*(*(a+1)+2)) = value at 4th position который является 4 в этом случае.

Как получается выход 2? Могу ли я получить какое-то объяснение? Выход: enter image description here

+1

'a' представляет собой массив из 3 массивов, каждый из которых имеет размер 4. Таким образом,' * (a + 1) '(который является просто причудливым способом записи' a [1] '), является вторым массивом размера 4 , то есть указатель. Использование '% d' для печати указателей дает вам большие числа, которые вы видите. '(a + 1) + 2' является просто' (a + 3) 'или эквивалентно' & a [3] ', все еще указателем. Ваша последняя строка - единственная, которая фактически указывает на целое число. –

ответ

1

Потому что только в последнем вы полностью разыщите указатель. И вы не должны печатать адреса с помощью спецификатора "%d".

Одна звезда разыменовывает один раз, так что результат *a имеет тип int *, поэтому он печатает адрес, когда вы используете два * то вам разыменования указателя на значение по нужному адресу.

(a+1) /* &a[1], so no dereference at all     */ 
    *(a+1) /* a[1], so it has type int[3] which decays to int* */ 
    (a+1)+2 /* &a[3], so no dereference at all     */ 
    *(a+1)+2 /* a[3], so it has type int[3] which decays to int* */ 
*(*(a+1)+2) /* a[1][2], it has type int you finally got a value */ 

Теперь вы ожидаете, что это будет 4 но смотреть на то, как вы инициализирован ваш 2d массив, это вводит в заблуждение должно быть

int a[3][4]={{1,2,3,4},{4,3,2,1},{1,3,4,1}}; 

затем

a[1][2] -> {4,3,2,1}[2] -> 2 

поэтому выход верно.

Если вы включите предупреждения компилятора, он должен пожаловаться на неверный спецификатор формата и фигурные скобки, отсутствующие в списке инициализаторов.

+0

* (a + 1) + 2, не должен ли он сначала отмечать + 1, получить значение, а затем добавить + 2 к значению, чтобы перейти к новой позиции в массиве? –

+0

@simikaur помните, что в c первый индекс равен '0' не' 1'. –

+0

Ваш ответ противоречит тому, что принадлежит Ли Даниэлю. Он должен сказать, что это массив из 3 массивов, каждый из 4-го размера, в то время как вы создали 4 массива каждого размера 3. –

1

a представляет собой массив из 3 массивов, каждый из размера 4. Так *(a+1) (который является только причудливым способом написания a[1]) является вторым массивом размера 4, то есть указатель. Использование %d для печати указателей дает вам большие числа, которые вы видите. (a+1)+2 - это всего лишь (a+3), или, что то же самое, &a[3], еще указатель. Ваша последняя строка является единственной, которая фактически ссылается на целое число.

+0

Ваш ответ противоречит действию iharob. Он должен сказать, что это массив из 4 массивов каждого размера 3, в то время как ваш ответ предлагает 3 массива каждого размера 4? –

+0

Простая ошибка. Я верю, что он исправил это сейчас. –

Смежные вопросы