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

У меня есть указатель на целочисленный массив из 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]

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