考虑这个C ++程序:
#include<iostream>
using namespace std;
int main() {
int x = 7;
int *ip = &x;
cout << "the value of x is " << x <<endl;
cout << "the address of x is " << &x <<endl;
cout << "the address stored at ip is "<< ip <<endl;
return 0;
}
这是我得到的输出:
the value of x is 7
the address of x is 0x28ff08
the address stored at the pointer is 0x28ff08
这对我有意义。但是,如果我将代码更改为以下内容,则会得到一组不同的输出:
#include<iostream>
using namespace std;
int main() {
int x = 7;
int *ip = &x;
cout << "the value of x is " << x <<endl;
cout << "the address of x is " << &x <<endl;
cout << "the address of the ip itself is "<< &ip <<endl;
return 0;
}
现在,我收到了这个输出:
the value of x is 7
the address of x is 0x28ff0c
the address of the ip itself is 0x28ff08
在第一个代码中,变量x
的地址和指针ip
中存储的地址是相同的,这对我来说很有意义。但在第二个程序中,ip
本身的地址保持不变,但x
的地址似乎正在改变,我觉得这令人困惑。我期望变量x
的地址与第一个程序中的地址和要更改的指针的地址保持一致。
有人可以解释这里发生了什么吗?
答案 0 :(得分:1)
第一个代码中的值是相同的,因为ip的值是x的地址(同样的事情,ip保持x的地址)。但在第二个代码中结果是不同的,因为x的地址不是ip的地址(ip是不同的变量 - 指针能够容纳其他变量的地址)。计算机将决定创建它们 - 谁知道。我认为这只是巧合,其中一个变量是在同一个地址上创建的,第二个是在不同的地址上创建的。
答案 1 :(得分:1)
我认为你可能会对指针对象的值,指针对象的地址,指针的值和指针的地址感到困惑。我认为最好通过图片来解释。如果你写
int x = 7;
int* ip = &x;
然后,在内存中,事情看起来像这样:
+-----------+ +-----------+
| 7 | <------------ | Address A |
+-----------+ +-----------+
int x int* ip
Address A Address B
此处,变量x
存储在某个位置(称为A
),并保存值7
。变量ip
存储在某个位置(称为B
),并将其值保存为地址A
。请注意,A
和B
必须彼此不同,因为x
和ip
占用了不同的内存位置。
现在,想想你写的时候会发生什么
cout << x << endl;
这会打印出x
中存储的值7
。 (我认为这并不奇怪。)
如果你写
cout << &x << endl;
您正在打印x
所在的地址。这将是A
恰好是什么价值,并且从程序运行到程序运行都会有所不同。
如果你写
cout << ip << endl;
您正在打印ip
中存储的值。由于ip
指向x
,ip
中存储的值是x
的地址,而A
恰好是cout << &ip << endl;
。
但是,如果你写
ip
您正在打印B
变量的地址。该地址由A
表示,它取决于程序的特定运行。请注意,B
和 +-----------+ +-----------+
| 7 | <------------ | Address A |
+-----------+ +-----------+
int x int* ip
Address A Address B
cout << x << endl; // Prints 7, the contents of x.
cout << &x << endl; // Prints A, the address of x.
cout << ip << endl; // Prints A, the contents of ip.
cout << &ip << endl; // Prints B, the address of ip.
不相同,所以您应该在这里看到不同的值。
回顾一下:
A
在您的情况下,似乎x
0x28ff0c
的地址为ip
,地址B
(0x28ff08
)为{{ 1}}。这并不意味着x
的地址发生了变化,而是表明ip
和x
占用了不同的内存地址。