Я пробовал вывод следующего кода. Но я пока не понимаю, что может означать значение 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?
Ты говоришь:
печать * q будет печатать адрес p
Однако это не так. печать q
будет печатать адрес p
, В конце концов, вы сделали это q = &p;
,
печать *q
напечатает значение p
, который является адресом x
,
Просто выведите значение и аргумент вашей переменной, и вы увидите:
x: 5 &x: 0x7fff691dfcc4
p: 0x7fff691dfcc4 &p: 0x7fff691dfcb8
q: 0x7fff691dfcb8 &q: 0x7fff691dfcb0
&var - location;
var - value
поскольку q
это указатель на p
, значение q
это место p
Что бы это ни значило на этой конкретной платформе. (Скорее всего адрес памяти, содержащий p
ценность.)
(В этом ответе я буду использовать 64-битные указатели и 32-битные целые числа, просто для того, чтобы иметь конкретные значения, о которых нужно писать. Хотя это справедливо для любых значений).
Давайте проанализируем p
первый. p
8 байт для хранения адреса (переменной x
). печать *p
напечатает значение, находящееся по этому адресу, который является 4 байтами значения переменной x
, Печать только p
напечатает 8 байтов адреса, хранящегося в p
,
Теперь то же самое относится к q
, q
8 байт, хранящих адрес переменной p
, Итак, печать *p
напечатает значение, находящееся по этому адресу, который является 8 байтами значения p
, Печать только q
напечатает 8 байтов адреса, хранящегося в q
,
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.
Надеюсь, я простой и понятный …
Указатель — это просто тип данных, не сильно отличающийся от других типов.
Он хранит адрес другого объекта данных, и вы можете использовать * p для доступа к объекту данных.
Таким образом, указатели не отличаются от других типов, но их содержание имеет особое значение.
(int **) — это такой указатель, который указывает на объект данных типа (int *), не сильно отличающийся от других указателей (они могут указывать на объект данных типа int).
Итак, содержимое q является указателем на p. * q указывает на то, что вы используете контент для поиска p.
содержимое p является указателем на целое число, * p указывает, что вы используете содержимое для поиска целого числа.
Добавляя ** перед q в объявлении q, вы говорите компилятору, что q является указателем, который будет указывать на адрес указателя. Поэтому, когда вы печатаете q, вы фактически печатаете адрес указателя p, а не значение адреса p, на которое указывает (то есть x).
В вашем коде p это указатель, который хранит адрес целого числа. Но у самого p есть адрес, который вы храните в q.