int a[10];
Теперь здесь & a и a одно и то же, я не совсем понимаю логику, почему это так. Могу ли я сказать, что значение a такое же, как и & a, а * (a) равно a [0]. (Но как не указатель). В случае с динамическим массивом мне все ясно.
int *da = new int[10];
значение da является базовым адресом, & da дает адрес, где хранится указатель, и мы полагаем, что da достигает da [0].
@Fureeish cout << a; и cout << & a; дает тот же результат.
std::string str = "1"; int x = 1; std::cout << str << ' ' << x; также выдаст такой же результат, но это не значит, что они одинаковы.
@Fureeish Я до сих пор не понимаю, что вы пытаетесь сказать, я имею в виду, как мне соотнести & a и a с вашей аналогией.
Я объяснил это в своем комментарии. &a - указатель на массив. Указатель на массив физически указывает на первый элемент массива, но это не указатель обычный на первый элемент массива. a - это имя массива, который в большинстве случаев из-за распад массива преобразуется в указатель на свой первый элемент. Вывод этих двух с помощью std::cout даст одно и то же значение, но принципиально они разные - вы не можете сравнивать их и не можете относиться к ним как к одному типу.
@curiousgeek: int (*)[10] vs int[10] для &a vs a (которые оба распадаются на int* в вашем случае использования).
@Fureeish Я не знал, что есть что-то вроде распада массива. Вот что вызвало путаницу. Теперь понятно спасибо!





Они не одинаковы.
a относится к типу int[10]; множество.
&a - это указатель на тип int[10].
В определенных ситуациях (переход к функциям при использовании в арифметических выражениях) aраспадается в тип int*. Затем вы можете использовать арифметика указателя для доступа к другим элементам массива. Это могло быть причиной вашего замешательства.
da относится к типу int*.
Само распадающаяся вещь Только - это указатель на функцию.
Я озадачен вашим последним предложением. Функции распадаются на указатели на функции, но указатели на функции не распадаются дальше, не так ли?
@ Квентин: О да, это так!
ну 'а' и '& а' определенно не одно и то же
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).
Надеюсь это поможет.
«Теперь здесь
&aиaодинаковые» - это неправда. Первый - это указатель на массив из 10 элементов, а второй - это имя массива, который, например, в случае сравнений, распадается на указатель на свой первый элемент.