我有一个示例代码:
#include <iostream>
#include <conio.h>
using namespace std;
int main ()
{
int firstvalue = 5, secondvalue = 15;
int * p1, * p2;
p1 = &firstvalue;
p2 = &secondvalue;
cout << "1.p1: " << p1 << ", p2: " << p2 << endl;
cout << "1.*p1: " << *p1 << ", *p2: " << *p2 << endl;
*p1 = 10;
cout << "2.p1: " << p1 << ", p2: " << p2 << endl;
cout << "2.*p1: " << *p1 << ", *p2: " << *p2 << endl;
*p2 = *p1;
cout << "3.p1: " << p1 << ", p2: " << p2 << endl;
cout << "3.*p1: " << *p1 << ", *p2: " << *p2 << endl;
p1 = p2;
cout << "4.p1: " << p1 << ", p2: " << p2 << endl;
cout << "4.*p1: " << *p1 << ", *p2: " << *p2 << endl;
*p1 = 20;
cout << "5.p1: " << p1 << ", p2: " << p2 << endl;
cout << "5.*p1: " << *p1 << ", *p2: " << *p2 << endl;
cout << "firstvalue is " << firstvalue << endl;
cout << "secondvalue is " << secondvalue << endl;
cout << "firstvalue is " << &firstvalue << endl;
cout << "secondvalue is " << &secondvalue << endl;
getch();
return 0;
}
这是输出:
1.p1: 0041FB40, p2: 0041FB34
1.*p1: 5, *p2: 15
2.p1: 0041FB40, p2: 0041FB34
2.*p1: 10, *p2: 15
3.p1: 0041FB40, p2: 0041FB34
3.*p1: 10, *p2: 10
4.p1: 0041FB34, p2: 0041FB34
4.*p1: 10, *p2: 10
5.p1: 0041FB34, p2: 0041FB34
5.*p1: 20, *p2: 20
firstvalue is 10
secondvalue is 20
firstvalue is 0041FB40
secondvalue is 0041FB34
在“p1 = p2”行中复制了什么? p1是否成为对p2的引用还是以不同的方式工作?
答案 0 :(得分:2)
您只需说:“现在p1
应指向与p2
相同的内存块”。
因此,他们开始指向相同的内存块(到相同的地址),因此共享相同的值。
答案 1 :(得分:1)
内存地址 p1占用p2(0041FB34)的存储器地址
答案 2 :(得分:1)
由于p2
包含secondvalue
的地址,p1=p2;
会将secondvalue
的地址从p2
复制到p1
。我建议不要把它称为引用,如果你可以帮助它 - 引用是另外一个类似于指针引起混淆的东西,所以调用指针作为引用(或者甚至认为它作为引用)是可能是一个糟糕的主意。
答案 3 :(得分:0)
分配后,p1
将包含与p2
相同的内存地址。这两个指针将指向同一个变量,因此*p1
和*p2
指的是相同的内存。
除此之外,p1
和p2
之间没有特殊关联。例如,p1 = &firstvalue
之类的后续分配不会更改p2
指针变量的任何内容,而p1
和p2
将再次指向不同的内存位置。
答案 4 :(得分:0)
=(赋值运算符)只将一个变量(p2)的值复制到另一个变量(p1)中。因此,在赋值之后,p1和p2是同义词,因为它们引用相同的地址 - 取消引用它们将给出相同的值,如打印输出中所示。
有关详细信息,请参阅指针article。