3

在这段代码中:

  int* a;
  int* b;
  int c;
  int* d;
  a=new int(5);
  b=&(*a);
  c=*a;
  d=&c;
  cout<<"*a = "<<*a<<endl;
  cout<<"a = "<<a<<endl;
  cout<<"b ="<<b<<endl;
  cout<<"d = "<<d<<endl;

我得到:

*a = 5
 a = 0x83a2008
 b =0x83a2008
 d = 0xbfbfe540

为什么d与b不同?他们不是 &(*a) 吗?我怎样才能用一行得到 d 结果?

非常感谢。

4

7 回答 7

7

a指向一个动态分配的位置,保存值 5。当你这样做时c = *a;,你将5 从那个动态分配的位置复制到c. 然后,您将获取地址c并将其分配给d(并打印出来)。

当你结束时是这样的:

在此处输入图像描述

实线表示指向位置的指针。虚线表示数据的移动。

于 2012-10-01T18:37:12.757 回答
6

c是它自己的int而不是一个int*. 当您说 时c = *a,您实际上是将指向的值分配a给一个单独的整数,该整数在内存中具有自己的空间(即使这int不是int*,它仍然必须存在于内存中的某个位置)。

因此,当您说 时d = &c,您得到的是 的地址c,而不是 的值a

于 2012-10-01T18:36:50.543 回答
1

d = &c;

d指向 指定的存储位置c,而不是 指向的存储位置a

于 2012-10-01T18:36:31.913 回答
1

d 是 c 的地址,c 是本地堆栈变量。b 是您在堆上分配的整数的地址,并将地址存储在 a 中。

于 2012-10-01T18:37:04.287 回答
1

c是整数的新实例,这就是为什么d不等于a也不b。因此,当您尝试获取存储在其中的值的地址时,a您会得到准确的地址a。但是,当您首先分配 to 的值,a然后c打印您的地址时,c您得到的地址与a. 在 C++ 中,您操作的是真实对象,而不是 Java 或 C# 中的引用。当您为变量赋值时,您会复制存储在此变量中的每个文件,但要小心 - 默认情况下,=操作员不会进行深度克隆。

于 2012-10-01T18:37:20.980 回答
1
于 2012-10-01T18:42:27.543 回答
0

我不知道其中的所有规则和微妙之处,但编译器能够简化&(*a)a. 因此,您正在初始化b以指向与a( b = a) 相同的整数。然后,您将按值将整数复制到c. 然后你正在初始化d指向c。所以aandb指向同一个整数,但d指向别的东西。

于 2012-10-01T18:37:18.717 回答