Создание переменной и последующее увеличение ее адреса памяти на 1 - PullRequest
1 голос
/ 03 апреля 2019

Я создал переменную, а затем напечатал номер ее местоположения.Затем я увеличил ячейку памяти на 1. Я получил желаемые результаты в двух случаях, в то время как один случай дает ответ, который мои учителя не могли должным образом объяснить.Было бы очень полезно, если бы кто-нибудь сказал мне, почему второй printf("%p\n",&i) дает тот же результат, что и первый раз.

int main()
{
    int i=3,*x;
    x=&i;
    printf("%p\n",x);
    printf("%p\n",&i);
    printf("%p\n",&(*x));
    x++;
    printf("\n");
    printf("%p\n",x);
    printf("%p\n",&i);
    printf("%p\n",&(*x));
}



0x7ffce5dc5208
0x7ffce5dc5208
0x7ffce5dc5208

0x7ffce5dc520c
0x7ffce5dc5208
0x7ffce5dc520c

Ответы [ 5 ]

5 голосов
/ 03 апреля 2019

Каждый объект в программе C имеет уникальный фиксированный адрес во время своего существования.Вы сохраняете копию адреса i в x.Затем вы манипулируете x, чтобы изменить значение, которое оно содержит, теперь оно содержит другой адрес.Но манипулирование значением в x не перемещается i.Объект с именем i все еще находится в том же месте.

2 голосов
/ 03 апреля 2019

Адрес переменной никогда не меняется в течение срока ее службы.То, что x начинается со значения этого адреса, а затем вы увеличиваете значение x, не означает, что адрес i изменяется.

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

Так что &i всегда будет иметь одно и то же значение, независимо от того, какое значение может содержать x.

1 голос
/ 03 апреля 2019

Кусок кода x = &i копирует адрес i в указатель x.Это копия, поэтому ее изменение только изменяет значение, сохраненное в x, и никогда не изменит адрес i.

Я не уверен, чего вы пытаетесь достичь.Вы не можете изменить адрес переменной.

1 голос
/ 03 апреля 2019

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

0 голосов
/ 03 апреля 2019

Это не имеет ничего общего с указателями и адресом памяти, в частности.Проверьте следующую программу

int x = 5;
int y = x;

printf (" x= %d, y = %d\n", x, y);
y++;
printf (" x= %d, y = %d\n", x, y);

Вывод:

x = 5, y = 5

x = 5, y = 6

Изменение y не влияет на значение x.То же самое применимо и в вашем случае.

Проще говоря, x и i - две разные переменные, у них есть свои собственные значения.Теперь, учитывая тот факт, что x является указателем и ему присвоено значение адреса i, вы можете использовать x, чтобы получить значение, хранящееся в i.Но это все.

Это не каким-то образом "связывает" две переменные вместе, они все равно могут быть изменены независимо друг от друга.Единственное, что после изменения значения x вы больше не можете использовать его для доступа к значению, хранящемуся в i, поскольку оно больше не указывает на адрес i.

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