Почему после присвоения я получаю разные значения указателя - PullRequest
2 голосов
/ 26 марта 2019

, поэтому я сейчас изучаю C ++ и пытаюсь понять, как соотносятся массивы и указатели. Приведенный ниже код показывает выполненные мной задания.

int A[4] = {20, 30, 40, 50};
int p = A[0];
int* q = &p;

Теперь, если я распечатываю значения указателя, я получаю это:

A == 0x7ffda1cb1ea0
&A == 0x7ffda1cb1ea0
&A[0] == 0x7ffda1cb1ea0
&p == 0x7ffda1cb1e94
q == 0x7ffda1cb1e94
&q == 0x7ffda1cb1e98

Я не очень понимаю, почему значения для & A [0] и & p отличаются, хотя присваивание ist p = A [0]. Я также не понимаю, почему между q и & q есть только 4 байта, хотя размер q указан как 8. Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

5 голосов
/ 26 марта 2019

Я не очень понимаю, почему значения & A [0] и & p отличаются

Это разные объекты в памяти, поэтому они имеют разные адреса.A[4] - это один объект, p - это еще один объект, q - это еще один объект.Назначение заставляет их содержать одно и то же значение, но они по-прежнему являются двумя разными объектами.Вы можете удалить присвоение, и результат будет таким же.

Я также не понимаю, как есть только 4 байта между q и & q, хотя размер q показан как 8

q имеет адрес p, а &p дает адрес q.Результат 4 имеет смысл, потому что вот такой большой p.Вот почему q идет 4 после p, потому что p занимает 4 байт.


Возможно, будет более понятно, если вы попробуете то же самое со ссылкой:

int A[4] = { 20, 30, 40, 50 };
int &p = A[0]; // note the "&", this makes p a reference
std::cout << "&A[0]: " << &A[0] << std::endl << "&p:    " << &p << std::endl;

Для меня это приводит к:

&A[0]: 008FFD90
&p:    008FFD90

Теперь p не отдельный объект, который может содержать копию данных, а фактическая ссылка на то же место.

3 голосов
/ 26 марта 2019

Я не очень понимаю, почему значения & A [0] и & p отличаются

A[0] и p являются отдельными объектами. Каждый объект имеет уникальный адрес в течение своего времени жизни (кроме определенных случаев, связанных с подобъектами). Время жизни A[0] и p перекрывается. Следовательно, &A[0] и &p не могут быть одинаковыми.

даже если присвоение ist p = A [0]

Назначение не влияет на то, где хранится объект. Он может влиять только на значение, хранящееся в объекте.

также не понимают, что между q и & q есть только 4 байта, хотя размер q показан как 8

Размер q не имеет значения, поскольку он указывает на более низкий адрес. Размер p бывает 4:

 /-offset from p
/  object in memory
00 p (first byte) \
01 p               |
02 p               |
03 p               |
04 q (first byte)  | Distance between p and q: 4
05 q 
06 q
07 q
08 q
09 q
10 q
11 q
1 голос
/ 26 марта 2019

Когда вы делаете int p = A [0], вы просто присваиваете значение A [0] для p.Они оба разные объекты и хранятся в разных местах.Значение & p не изменится, если вы измените значение p.

Пробел 4 связан с размером p, он не связан с размером q

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