修改指针值



这个问题真的很愚蠢,但我很困惑。

所以,我的理解是,如果你有:

int i(3);
int& j(i);
int* k(&i);

在这种情况下,如果j的值发生变化,那么i的值也会发生变化,因为j基本上是i的别名?另一方面,如果我们让k指向其他东西,那么ij的值就不会改变,对吧?

如果以上是真的,那么如果我们有:

a = 1; b = 2;
p = &a; q = &b;
*p = *q;

那么为什么a的值变为2呢?我认为p只是指向其他东西,而这并没有修改a的值?

猜想1是正确的。

只要k指向i(顺便说一句,int* k(&j);也会将k指向i,因为ji(,*k=10;就会将i设置为10。如果你把k指向其他地方,那么*k=10;会改变它现在指向的任何地方。

但在第二部分中,p从未改变为指向远离a,因此写入*p将改变aqp是完全独立的,因此将q指向b只是意味着q指向b,而*p = *q;实际上是a=b。更改这两个指针中的任何一个指向哪里,都会得到不同的结果。

在第一个示例中,i是一个变量,具有许多属性,其中两个属性是内存中的地址和名称(i(。ji的别名,因此它只是与i相同内存位置的替代名称。或者,换句话说,底层内存位置有两个名称——一个名称是i,另一个名称为j

任何影响底层存储器的操作都会同时更改ij的值。因此,分配给i会影响(通过内存位置(j的值,反之亦然。例如,i = 42将通过更改底层内存位置的内容来工作,并且由于j是同一内存位置的替代名称,因此将导致条件j == 42为真,反之亦然。

CCD_ 49是包含CCD_ 50的地址(即底层存储器位置的地址(的变量。分配给*k会影响内存位置,因此会更改i,从而更改j。例如,*k = 21将导致i == 21 && j == 21为真。

指针和引用之间的一个关键区别是,指针可以重新分配(因此它包含不同内存位置的地址(,但引用不能。因此,不可能将ij与不同的存储器位置相关联。然而,分配k = &some_other_int将使k包含some_other_int的地址,并且k将不再与ij有任何关联。对*k执行任何操作都会影响名称为some_other_int的内存位置,但不会影响与ij关联的值。

在第二个示例中,p的值是a的地址,而q的值则是b的地址。然而,表达式*p = *q通过提取q所指向的存储位置处的值(即b的值(并将其分配到p所指向的存储器位置(其具有名称a(来工作。因此CCD_ 77具有与CCD_ 78或CCD_ 79甚至CCD_。从这个意义上讲,*p*q可以分别被视为对ab的引用(或替代名称或别名(。

最新更新