Почему & a и то же самое в случае статических массивов в C++?

int a[10];

Теперь здесь & a и a одно и то же, я не совсем понимаю логику, почему это так. Могу ли я сказать, что значение a такое же, как и & a, а * (a) равно a [0]. (Но как не указатель). В случае с динамическим массивом мне все ясно.

int *da = new int[10];

значение da является базовым адресом, & da дает адрес, где хранится указатель, и мы полагаем, что da достигает da [0].

«Теперь здесь &a и a одинаковые» - это неправда. Первый - это указатель на массив из 10 элементов, а второй - это имя массива, который, например, в случае сравнений, распадается на указатель на свой первый элемент.

Fureeish 18.10.2018 10:48

@Fureeish cout << a; и cout << & a; дает тот же результат.

curiousgeek 18.10.2018 10:51
std::string str = "1"; int x = 1; std::cout << str << ' ' << x; также выдаст такой же результат, но это не значит, что они одинаковы.
Fureeish 18.10.2018 10:51

@Fureeish Я до сих пор не понимаю, что вы пытаетесь сказать, я имею в виду, как мне соотнести & a и a с вашей аналогией.

curiousgeek 18.10.2018 10:53

Я объяснил это в своем комментарии. &a - указатель на массив. Указатель на массив физически указывает на первый элемент массива, но это не указатель обычный на первый элемент массива. a - это имя массива, который в большинстве случаев из-за распад массива преобразуется в указатель на свой первый элемент. Вывод этих двух с помощью std::cout даст одно и то же значение, но принципиально они разные - вы не можете сравнивать их и не можете относиться к ним как к одному типу.

Fureeish 18.10.2018 10:55

@curiousgeek: int (*)[10] vs int[10] для &a vs a (которые оба распадаются на int* в вашем случае использования).

Jarod42 18.10.2018 10:56

@Fureeish Я не знал, что есть что-то вроде распада массива. Вот что вызвало путаницу. Теперь понятно спасибо!

curiousgeek 18.10.2018 11:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
135
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Они не одинаковы.

a относится к типу int[10]; множество.

&a - это указатель на тип int[10].

В определенных ситуациях (переход к функциям при использовании в арифметических выражениях) aраспадается в тип int*. Затем вы можете использовать арифметика указателя для доступа к другим элементам массива. Это могло быть причиной вашего замешательства.

da относится к типу int*.

Само распадающаяся вещь Только - это указатель на функцию.

Я озадачен вашим последним предложением. Функции распадаются на указатели на функции, но указатели на функции не распадаются дальше, не так ли?

Quentin 18.10.2018 11:12

@ Квентин: О да, это так!

Bathsheba 18.10.2018 11:16

ну 'а' и '& а' определенно не одно и то же

int a[10] takes up a specific block from memory to allocate exactly 10 integers and this block is called a.

'&a' refers to the memory address of this memory block of 10 integers you made. it's like you have a hotel room (the array of 10 elements) in your hotel. And (your memory address) '&a' refers to your room number, your address.

now saying for example int *p = &a means I'm making an integer pointer 'p' that can only point to integers, and i'm giving it the memory address of 'a' (the array of integers) so it can point to it.

так :

int a[10] is your hotel room;

&a is your room number;

*p = &a is the key chain attached to your room number (ur keychain points to ur room number, your address);

поэтому иногда мы используем: int * da = new int [10]; чтобы немедленно выделить в памяти место для 10 целых чисел и напрямую указать на него указатель (в данном случае da).

Надеюсь это поможет.

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