Почему адреса arr и &arr одинаковы в "C"

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

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

Код

#include <stdio.h>

int main()
{
    char arr[3];

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

    return 0;
}

Выход

array = 0061FF1D
&array[0] = 0061FF1D
&array = 0061FF1D

Массивы просто особенные в C. И когда я говорю «особенный», я имею в виду пренебрежительное отношение. Просто нужно узнать подробности.

hyde 25.11.2022 06:22
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
1
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Важно отметить, что хотя между массивами и указателями есть некоторое сходство, они не совпадают.

Имя array не указывает на адрес первого элемента. Фактически это весь массив. Путаница возникает из-за того, что в большинстве случаев имя массива сводится к указателю на его первый член.

Два примечательных места, где не происходит распада массива на указатель, — это когда массив является операндом либо оператора sizeof, либо оператора адреса &. Что касается последнего, массив — это непрерывный набор объектов, и (как и любой объект) он имеет адрес. Адрес массива совпадает с адресом его первого члена, поэтому array (при использовании в выражении или эквивалентно &array[0]) и &array будут иметь одно и то же значение, но разные типы.

В вашем конкретном случае &array[0] имеет тип char *, а &array имеет тип char (*)[3] (т.е. указатель на массив char размера 3).

1 + 2 и 1.0 + 2.0 имеют одинаковую сумму значений, но разных типов. printf("%p\n", arr); printf("%p\n", &arr); printf("%p\n", &arr[0]); печать одного и того же не означает, что arr и &arr это одно и то же — больше, чем 3 и 3.0 отличаются некоторыми атрибутами.

Другие вопросы по теме