разыменование указателя на целочисленный массив

У меня есть указатель на целочисленный массив из 10. Что должна дать мне разыменование этого указателя?

Например:

#include<stdio.h>

main()
{
    int var[10] = {1,2,3,4,5,6,7,8,9,10};
    int (*ptr) [10] = &var;

    printf("value = %u %u\n",*ptr,ptr);  //both print 2359104. Shouldn't *ptr print 1?


}
12 голосов | спросил chappar 5 J000000Sunday09 2009, 09:08:48

3 ответа


0

Разыменование - это указатель на массив. Таким образом, разыменование дает вам массив. Передача массива в printf (или в любую функцию) передает адрес первого элемента.

Вы сообщаете printf, что передаете ему unsigned int (%u), но на самом деле передается int*. Числа, которые вы видите, являются адресами первого элемента массива, интерпретируемого как беззнаковое целое.

Конечно, это неопределенное поведение. Если вы хотите напечатать адрес, вы должны использовать %p и передать void*.

ответил Johannes Schaub - litb 5 J000000Sunday09 2009, 09:24:30
0

Когда вы объявляете

int var[10];

ссылка на var имеет тип указатель на int (ссылка на раздел« Часто задаваемые вопросы о C ») .

Ссылка на &var - это указатель на массив размером 10 дюймов.

Ваша декларация int (*ptr) [10] правильно создает указатель на массив из 10 дюймов, которому вы назначаете &var (адрес указателя на массив из 10 дюймов) (Ссылка на раздел« Часто задаваемые вопросы ») .

Надеемся, что эти вещи понятны, ptr распечатает базовый адрес указателя на массив 10 дюймов.

*ptr затем напечатает адрес первого элемента из массива 10 дюймов .

Они оба в этом случае равны, и поэтому вы видите один и тот же адрес.

И да, **ptr would give you 1.

ответил Aditya Sehgal 5 J000000Sunday09 2009, 10:09:22
0

Полагаю, это могло бы принести больше ясности.

(я просто использую фрагмент кода, чтобы уменьшить беспорядок)

Декларация:

int a[5];
a[5] = {0,1,2,3,4);

Косвенность

ptr = a   <======>  ptr = &a[0]

Разыменование

*ptr = *a <======> *ptr = *&a[0]
                   *ptr =   a[0]

поэтому мы можем написать:

*(ptr + i) = *(a + i) <======> *(ptr + i) = a[i]

ПРИМЕЧАНИЕ. '<=====>' это просто знак для «подразумевает». Ничего особенного!!! Надеюсь, я не ошибаюсь?

ответил bluedroid 11 J000000Thursday13 2013, 11:47:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132