0

Я инициализировал массив в C++, используя как статическое, так и динамическое распределение.Статическая и динамическая адресация памяти памяти?

// dynamic allocation... len is input by user. 
int *data = new int [len]; 
// print memory address 
cout<< &data<<endl; 
cout<< &data[0]<<endl; 
// static allocation... 
int *arr1[10]; 
// print memory address 
cout<< &arr1<<endl; 
cout<< &arr1[0]<<endl; 

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

0x7fffb9f3dd40

0x24c6010

0x7fffb9f3dcf0

0x7fffb9f3dcf0

Это, казалось, работать, как и ожидалось для arr1. Может кто-нибудь объяснить это? Что мне не хватает?

+0

данные 'int * data' здесь указатель; вывод его указателя приводит к указателю на указатель. 'int * arr1 [10]' arr1 - массив (указателей); взятие его указателя приводит к указателю на первый элемент массива. –

ответ

2

data и arr1 очень разные здесь: data является указателем на массив int, arr1 является int* массив. Так как &data является адресом указателя на массив, а не адресом первого элемента массива.

+0

Таким образом, данные будут указывать на адрес, в котором хранится местоположение первого элемента массива? Я хочу сказать, что данные и данные [0] будут показывать одно и то же? и & data будет показывать местоположение указателя? – ashishv

+0

Извините, я немного отредактировал его, когда вы печатали. Надеюсь, это все равно! – ashishv

+0

Значение 'data' является указателем на первый элемент массива. '& data' - это адрес этой переменной.' & data [0] '- это адрес первого элемента массива. – TartanLlama

0

Эта строка кода

cout<< &data<<endl; 

Печать адреса переменной указателя, а не его содержимое, полученное с new.

0

&data возвращает адрес самой переменной data. &data[0] возвращает адрес первого элемента data указывает на.

0

данные указывают на адрес в куче, но данные & указывают на данные и что они живут в стеке.

+0

«куча» и «стопка» не определены в C++ в том виде, как вы описываете. Динамическое выделение происходит из свободного хранилища, а данные в «стеке» могут альтернативно быть в регистре или оптимизированы. – TartanLlama

+0

Хорошо, я, возможно, использовал условия на практике. – Paani

Смежные вопросы