我正在忙着学习指针并且玩弄不同的结果。 在这样做的时候,我注意到当我声明一个变量并获得它的地址时,我得到一个值。但是当我声明一个指向该变量的指针时,我得到了同一个变量的不同地址。我还看到这个给变量的新地址实际上是指针本身的地址(在检查之后)。怎么会这样?
要清楚;我声明int a
然后int *p
指向a
。 a
的地址为0x22ff2c
(最初在声明指针之前),指针p
的地址为0x22ff28
。我声明指针后a
的新地址也是0x22ff28
,与指针本身的地址相同。
我环顾四周,在这里寻找答案,但并没有真正得到我需要的东西。在这里作为一些接近的链接。这SO Link1触及了这个主题,但并没有告诉我我不知道的事情。另一个SO Link2看起来与我要求的类似,但它的方式太先进了,让我头晕目眩。
一个简单的解释将不胜感激,因为我仍然是C ++的新手,谢谢。
int main()
{
int a = 1;
std::cout << "Address1: " << &a;
return 0;
}
地址1:0x22ff2c
int a = 1;
int *p;
p = &a;
std::cout << "Address1: " << p;
return 0;
地址1:0x22ff28
int a = 1;
int *p;
p = &a;
std::cout << "Address1: " << p << "\n" << "Address2: " << &a;
return 0;
地址1:0x22ff28
地址2:0x22ff28
int a =1;
int *p;
p = &a;
std::cout << "Address1: " << &p;
地址1:0x22ff28
答案 0 :(得分:2)
因为&a == p
。您不打印指针的地址。对于该打印&p
而不是p
。你可能会得到一个不同的地址。
试试这个:
#include <iostream>
int main() {
int a = 3 ;
int *p = &a ;
std::cout << &a << "\n" << p << "\n" << &p ;
return 0;
}
答案 1 :(得分:0)
0x22ff28
不是指针的地址,而是指针所指向的目标的地址。这是a
。指针的地址是&p
。
答案 2 :(得分:0)
以下是我认为您尝试提出的问题的一部分:首先a
的地址为0x22ff2c,然后程序被更改为变量p
,之后a
1}}有不同的地址。为什么呢?
答案是,编译器在构建第二个程序时做出的选择与构建第一个程序时的选择不同。毕竟,他们已经不同的计划了。
两个不同程序使用的实际内存地址(即使它们大多相似)可能因各种原因而不同。它们并不具有可比性。 (当你进入更复杂和更不可预测的情况时,尤其是使用动态分配时,同一程序的不同调用所使用的内存地址可能会有所不同。)
现在,问题的另一部分:
&#34; a&#34;的新地址我声明指针后也是0x22ff28,与指针本身的地址相同。
在您显示的代码中,您只检查p
包含的地址,而不是p
本身所在的地址。如果您尝试输出&p
,那么您将会看到它的位置并发现它确实与&a
不同。