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

12

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


}

Ваш Ответ

3   ответа
15

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

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

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

Error: User Rate Limit Exceeded chappar
Error: User Rate Limit Exceeded**ptrError: User Rate Limit Exceeded(*ptr)[0]Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededsizeof(*ptr) == 10*sizeof(int)Error: User Rate Limit Exceeded&*ptr == int(*)[10]
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded<inttypes.h>Error: User Rate Limit Exceeded
11

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

int var[10];

ссылка наvar имеет типpointer to int (Ссылка на раздел с часто задаваемыми вопросами).

Ссылка на&var этоpointer to an array 10 дюймов.

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

С этими вещами, надеюсь, понятно,ptr затем напечатает базовый адресpointer to the array 10 дюймов.

*ptr затем распечататьaddress of the first element изthe array of 10 ints.

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

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

Error: User Rate Limit Exceeded
-3

Я предполагаю, что это может внести больше ясности:

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

Declaration:

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

Indirection

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

Dereferencing

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

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

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

NOTE: & APOS; & Lt; & =====; & GT APOS; это просто знак "подразумевает". Ничего особенного!!! Надеюсь, я не ошибаюсь?

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