【问题标题】:Modify Pointer Value修改指针值
【发布时间】:2021-12-19 03:18:24
【问题描述】:

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

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

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 的值?

【问题讨论】:

    标签: c++ pointers


    【解决方案1】:

    猜想1是正确的。

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

    但是在第二部分中,p 没有任何改变指向远离a,所以写信给*p 将改变aqp 完全分离,因此将 q 指向 b 仅意味着 q 指向 b*p = *q; 实际上是 a=b 更改其中任何一个指针指向的位置,您将得到不同的结果。

    【讨论】:

      【解决方案2】:

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

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

      k 是一个包含i 地址的变量(即底层内存位置的地址)。分配给*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 指向的内存位置(名称为@ 987654362@)。所以*p = *q*p = ba = b 甚至a = *b 具有相同的净效应。从这个意义上说,*p*q 可以分别被视为对ab 的引用(或替代名称或别名)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多