这个问题真的很愚蠢,但我很困惑。
所以,我的理解是,如果你有:
int i(3);
int& j(i);
int* k(&i);
在这种情况下,如果j
的值发生变化,那么i
的值也会发生变化,因为j
基本上是i
的别名?另一方面,如果我们让k
指向其他东西,那么i
和j
的值就不会改变,对吧?
如果以上是真的,那么如果我们有:
a = 1; b = 2;
p = &a; q = &b;
*p = *q;
那么为什么a
的值变为2呢?我认为p
只是指向其他东西,而这并没有修改a
的值?
猜想1是正确的。
只要k
指向i
(顺便说一句,int* k(&j);
也会将k
指向i
,因为j
是i
(,*k=10;
就会将i
设置为10
。如果你把k
指向其他地方,那么*k=10;
会改变它现在指向的任何地方。
但在第二部分中,p
从未改变为指向远离a
,因此写入*p
将改变a
。q
与p
是完全独立的,因此将q
指向b
只是意味着q
指向b
,而*p = *q;
实际上是a=b
。更改这两个指针中的任何一个指向哪里,都会得到不同的结果。
在第一个示例中,i
是一个变量,具有许多属性,其中两个属性是内存中的地址和名称(i
(。j
是i
的别名,因此它只是与i
相同内存位置的替代名称。或者,换句话说,底层内存位置有两个名称——一个名称是i
,另一个名称为j
。
任何影响底层存储器的操作都会同时更改i
和j
的值。因此,分配给i
会影响(通过内存位置(j
的值,反之亦然。例如,i = 42
将通过更改底层内存位置的内容来工作,并且由于j
是同一内存位置的替代名称,因此将导致条件j == 42
为真,反之亦然。
CCD_ 49是包含CCD_ 50的地址(即底层存储器位置的地址(的变量。分配给*k
会影响内存位置,因此会更改i
,从而更改j
。例如,*k = 21
将导致i == 21 && j == 21
为真。
指针和引用之间的一个关键区别是,指针可以重新分配(因此它包含不同内存位置的地址(,但引用不能。因此,不可能将i
或j
与不同的存储器位置相关联。然而,分配k = &some_other_int
将使k
包含some_other_int
的地址,并且k
将不再与i
或j
有任何关联。对*k
执行任何操作都会影响名称为some_other_int
的内存位置,但不会影响与i
或j
关联的值。
在第二个示例中,p
的值是a
的地址,而q
的值则是b
的地址。然而,表达式*p = *q
通过提取q
所指向的存储位置处的值(即b
的值(并将其分配到p
所指向的存储器位置(其具有名称a
(来工作。因此CCD_ 77具有与CCD_ 78或CCD_ 79甚至CCD_。从这个意义上讲,*p
和*q
可以分别被视为对a
和b
的引用(或替代名称或别名(。