Какое значение печатает указатель на указатель, если вообще не используется ни один оператор разыменования?

Я пробовал вывод следующего кода. Но я пока не понимаю, что может означать значение q.

Я понимаю, что * q указывает на p, подразумевая, что печать * q будет печатать адрес p, где как ** q будет печатать значение по адресу p, на который указывает, то есть x (= 5).

#include <iostream>
using namespace std;
int main()
{
int x=5;
int *p,**q;
p=&x;
q=&p;
cout<<q;
return 0;
}

Так что же представляет собой один q? Что это за значение, которое печатается, когда печатается только q?

3

Решение

Ты говоришь:

печать * q будет печатать адрес p

Однако это не так. печать q будет печатать адрес p, В конце концов, вы сделали это q = &p;,

печать *q напечатает значение p , который является адресом x,

1

Другие решения

Просто выведите значение и аргумент вашей переменной, и вы увидите:

   x: 5                     &x: 0x7fff691dfcc4
p: 0x7fff691dfcc4        &p: 0x7fff691dfcb8
q: 0x7fff691dfcb8        &q: 0x7fff691dfcb0

&var - location;
var - value
2

поскольку q это указатель на p, значение q это место pЧто бы это ни значило на этой конкретной платформе. (Скорее всего адрес памяти, содержащий pценность.)

1

(В этом ответе я буду использовать 64-битные указатели и 32-битные целые числа, просто для того, чтобы иметь конкретные значения, о которых нужно писать. Хотя это справедливо для любых значений).

Давайте проанализируем p первый. p 8 байт для хранения адреса (переменной x). печать *p напечатает значение, находящееся по этому адресу, который является 4 байтами значения переменной x, Печать только p напечатает 8 байтов адреса, хранящегося в p,

Теперь то же самое относится к q, q 8 байт, хранящих адрес переменной p, Итак, печать *p напечатает значение, находящееся по этому адресу, который является 8 байтами значения p, Печать только q напечатает 8 байтов адреса, хранящегося в q,

1

int x = 1;

Блок памяти выделен для хранения значения int. И этот блок называется «х». Скажем, х выделен в 0x1234.

int * p;

Здесь p — указатель на int, что означает, что p будет содержать адрес некоторого int. Допустим, p выделен адрес 0x2345.

p = &x;

Это заставит p содержать адрес x, т.е. 0x1234 будет храниться в месте, отведенном для p.

int **q;

Здесь q — указатель на указатель на int, что означает, что q будет содержать адрес указателя на int. Допустим, q выделен адрес 0x3456.

q = &p;

Это заставит q содержать адрес p, т. Е. 0x2345 будет храниться в месте, выделенном q.

Надеюсь, я простой и понятный …

1

Указатель — это просто тип данных, не сильно отличающийся от других типов.
Он хранит адрес другого объекта данных, и вы можете использовать * p для доступа к объекту данных.
Таким образом, указатели не отличаются от других типов, но их содержание имеет особое значение.

(int **) — это такой указатель, который указывает на объект данных типа (int *), не сильно отличающийся от других указателей (они могут указывать на объект данных типа int).

Итак, содержимое q является указателем на p. * q указывает на то, что вы используете контент для поиска p.
содержимое p является указателем на целое число, * p указывает, что вы используете содержимое для поиска целого числа.

1

Добавляя ** перед q в объявлении q, вы говорите компилятору, что q является указателем, который будет указывать на адрес указателя. Поэтому, когда вы печатаете q, вы фактически печатаете адрес указателя p, а не значение адреса p, на которое указывает (то есть x).

В вашем коде p это указатель, который хранит адрес целого числа. Но у самого p есть адрес, который вы храните в q.

1
По вопросам рекламы [email protected]