Я просто пытаюсь раскрыть секреты C и указателей (еще раз), и у меня возник вопрос относительно указателей и распада. Вот код:

#include <stdio.h>

int main() {
    int array[] = { 1, 2, 3 };
    int (*p_array)[] = &array;

    printf("%p == %p == %p\n", array, &array, &array[0]);
    printf("%p == %p\n", p_array, &p_array);

    return 0;
}

Когда я запускаю это, я получаю такой результат:

0x7fff5b0e29bc == 0x7fff5b0e29bc == 0x7fff5b0e29bc

0x7fff5b0e29bc == <▪0x7fff5b0e29b0

Я понимаю, что array, &array, &array[0] все одинаковы, потому что они распадаются на указатель, указывающий на одно и то же место.

Но как это применимо к реальным указателям, здесь *p_array, который является указателем на массив int, верно? p_array должен указывать на место, где хранится первый int массива. Но почему местоположение p_array не совпадает с местоположением &p_array?

Возможно, это не лучший пример, но я был бы признателен, если бы кто-нибудь меня просветил ...

Изменить: p_array относится к адресу первого элемента массива, тогда как &p_array относится к адресу самого указателя p_array.

Всего наилучшего, Дэвид

3
DeBe 26 Дек 2015 в 21:16

3 ответа

Лучший ответ

Но почему местоположение p_array не совпадает с местоположением &p_array?

&p_array - это адрес самого указателя (0x7fff5b0e29b0), тогда как p_array - это указатель на array, а его значение - это адрес array 1 , (0x7fff5b0e29bc).


1. Адрес первого элемента.

2
Ziezi 26 Дек 2015 в 20:00

Вы просто ввели другую переменную. Таким образом, он имеет значение (0x7fff5b0e29bc) и адрес (0x7fff5b0e29b0). Это будет так для любой вводимой вами переменной

0
Hans Lepoeter 26 Дек 2015 в 23:34

Я понимаю, что массив, & array и & array [0] одинаковы, потому что они распадаются на указатель, указывающий на одно и то же место.

Нет. Вы не поняли. array имеет тип массива и в большинстве случаев преобразуется в указатель на свой первый элемент. Следовательно, array и &array[0] такие же, как выражение, за исключением операнда оператора sizeof. &array - это адрес массива array и имеет тип int (*)[3]. Подробнее читайте здесь: Какое именно имя массива в c?.

p_array - указатель на массив array и хранит его адрес, а &p_array - адрес p_array.

3
Community 23 Май 2017 в 12:15