Указатель разыменования на целочисленный массив
У меня есть указатель на целочисленный массив из 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?
}
Ответы
Ответ 1
То, что вы разыскиваете, является указателем на массив. Таким образом, разыменование дает массив. Передача массива printf (или любой функции) передает адрес первого элемента.
Вы сообщите printf
, что вы передаете ему unsigned int
(%u
), но на самом деле то, что передано, является int*
. Номера, которые вы видите, являются адресами первого элемента массива, которые интерпретируются как unsigned int.
Конечно, это поведение undefined. Если вы хотите распечатать адрес, вы должны использовать %p
и передать void*
.
Ответ 2
Когда вы объявляете
int var[10];
ссылка на var
имеет указатель на тип int (ссылка на раздел C Faq Relevant).
Ссылка на &var
- это указатель на массив из 10 целых чисел.
Ваша декларация int (*ptr) [10]
правильно создает указатель на массив из 10 целых чисел, которому вы назначаете &var
(адрес указателя на массив из 10 целых чисел) (ссылка на раздел C Faq Relevant).
С этими вещами, надеюсь, ясно, ptr
затем распечатает базовый адрес указателя на массив из 10 целых чисел.
*ptr
затем распечатает адрес первого элемента массива из 10 целых чисел.
Оба они в этом случае равны, и поэтому вы видите один и тот же адрес.
И да, **ptr would give you 1.
Ответ 3
Я предполагаю, что это может принести больше ясности:
(Я просто использую фрагмент кода для уменьшения помех)
Декларация:
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]
ПРИМЕЧАНИЕ: '< ===== > ' - это просто знак для "подразумевает". Ничего особенного!!!
Надеюсь, я не ошибаюсь?