Адрес указателя, указывающего на первый элемент - PullRequest
0 голосов
/ 09 октября 2018

На веб-сайте http://www.fredosaurus.com/notes-cpp/arrayptr/array-diagrams.html указано, что

Указатели содержат адрес памяти других данных и представлены черным диском со стрелкой, указывающей на данные, на которые они ссылаются.

Например,

int a[5];  // Allocates memory for 5 ints.
. . .
a[0] = 1;
for (int i=1; i<5; i++) {
a[i] = a[i-1] * 2;
}

приведет к. enter image description here

Мой вопрос заключается в том, как я могу напечатать адресуказатель, указывающий на массив?Я знаю, что &a или &a[0] дает нам адрес первого элемента.Но как я могу получить доступ к указателю, указывающему на массив?

Ответы [ 4 ]

0 голосов
/ 09 октября 2018

Я знаю, что &a или &a[0] дает нам адрес первого элемента.

Технически.&a фактически является адресом самого массива.Он просто имеет то же значение, что и адрес первого элемента.Но обратите внимание, что тип выражения отличается.&a - это int (*)[5] (указатель на массив из 5 целых чисел), в то время как &a[0] - это int* (указатель на целое число).

Мой вопрос: как мне напечататьадрес указателя, указывающего на массив?

Первый шаг - получить указатель.В вашем примере нет переменных-указателей.Массив не является указателем.Предложение «Фактическая переменная массива, в данном примере, является указателем на память для всех ее элементов.» страницы очень вводит в заблуждение, поскольку массив не является объектом указателя.Нарисованная диаграмма не соответствует программе.

Вот программа, которая соответствует схеме:

int array[5];   // Allocates memory for 5 ints.
int* a = array; // a pointer to the first element of the array
a[0] = 1;
for (int i=1; i<5; i++) {
    a[i] = a[i-1] * 2;
}

Здесь у нас фактически есть указатель.Теперь вы можете распечатать адрес указателя:

std::cout << &a;
0 голосов
/ 09 октября 2018

Массив и указатель - это не одно и то же.На самом деле память выглядит так:

   a
-------
|  1  |  a[0]
-------
|  2  |  a[1]
-------
|  4  |  a[2]
-------
|  8  |  a[3]
-------
| 16  |  a[4]
-------

Так что, если бы вы печатали a и &a, вы бы увидели, что они печатают одно и то же значение.

0 голосов
/ 09 октября 2018

Если массив находится в стеке, как это было бы в вашем примере кода, то изображение ниже является более точным представлением того, как будет распределена память.Я также добавил дополнительный указатель, чтобы, надеюсь, добавить некоторые пояснения.

int a[5];
a[0] = 1;
for (int i=1; i<5; i++)
    a[i] = a[i-1] * 2;

int* b = a;

Возможно, будет проще думать о нотации []определения массива как маленький синтаксический сахар.При вызове функций и передаче a функция будет вызываться с передаваемым адресом a[0].

При передаче b в функцию будет передано значение, котороеадрес a.

0 голосов
/ 09 октября 2018

У вас может быть множество указателей, указывающих на a[0].

Как и для указателя на массив, создайте переменную-указатель, указывающую на a[0], а затем возьмите указатель на нее.У вас будет один указатель на один указатель, указывающий на массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...