关于示例的C ++指针

时间:2010-06-07 21:34:30

标签: c++ pointers

我有一个示例代码:

#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的引用还是以不同的方式工作?

5 个答案:

答案 0 :(得分:2)

您只需说:“现在p1应指向与p2相同的内存块”。

因此,他们开始指向相同的内存块(到相同的地址),因此共享相同的值。

答案 1 :(得分:1)

内存地址 p1占用p2(0041FB34)的存储器地址

答案 2 :(得分:1)

由于p2包含secondvalue的地址,p1=p2;会将secondvalue的地址从p2复制到p1。我建议不要把它称为引用,如果你可以帮助它 - 引用是另外一个类似于指针引起混淆的东西,所以调用指针作为引用(或者甚至认为它作为引用)是可能是一个糟糕的主意。

答案 3 :(得分:0)

分配后,p1将包含与p2相同的内存地址。这两个指针将指向同一个变量,因此*p1*p2指的是相同的内存。

除此之外,p1p2之间没有特殊关联。例如,p1 = &firstvalue之类的后续分配不会更改p2指针变量的任何内容,而p1p2将再次指向不同的内存位置。

答案 4 :(得分:0)

=(赋值运算符)只将一个变量(p2)的值复制到另一个变量(p1)中。因此,在赋值之后,p1和p2是同义词,因为它们引用相同的地址 - 取消引用它们将给出相同的值,如打印输出中所示。

有关详细信息,请参阅指针article