【问题标题】:What is the difference between `*a =` and `= *a`?`*a =` 和 `= *a` 有什么区别?
【发布时间】:2015-06-18 09:54:37
【问题描述】:

在下面的函数中,

void swap(int * a, int * b) {
    int t;
     t = *a; // = *a
    *a = *b; // a* =
    *b =  t;
}

= *a 和 *a = 有什么区别?

我听说= *a 中的* 运算符是一个解引用(或间接)运算符,它从指针中获取(?)该值。

那么,*a =的真正含义是什么?


昨天,我问这个问题的那天,我向我的同事解释了指针,他的专业领域与指针无关。

我快速键入了这样的源代码。

#include <stdio.h>

void swap1(int a , int b) {
    int t = a;
    a = b;
    b = t;
}

void swap2(int * a, int * b) {
    int t = *a;
    *a = *b;
    *b = t;
}

int main(int argc, char * argv[]) {
    int a = 10;
    int b = 20;
    swap1(a, b);
    swap2(&a, &b);
}

我什至为自己能记住 1996 年印在我脑海中的事情而感到自豪。(我使用 Java 已经将近 20 年了。) 我用了一堆printfs 和%ds 和%ps 来向她展示发生了什么。

然后我犯了一个可怕的错误。我声明。

포인터 변수 앞에 별을 붙이면 값을 가져온다는 뜻이에요。

当您在指针变量前面附加 STAR 时,这意味着您获取(检索)该值。

这可以应用于以下语句。

int t = *a;

简单地说,

int t = 10;

我面临的最大问题来自第二个陈述。

*a = *b; // 10 = 20?

问题的根源在于我没有尝试解释 dereference operator 或者我没有要求自己意识到 a 的含义별(明星)。

这是人们会说的。

对于= *a,

实际值将a表示的地址分配给左侧。

为*a =

右侧的值存储在a表示的地址中。

这就是我感到困惑的地方。这就是为什么我应该重新思考“去引用”的含义。

感谢您的回答。


哦,我认为这个问题要深入到lvalues 和rvalues 的概念上。

【问题讨论】:

标签: c pointers dereference lvalue rvalue


【解决方案1】:

第一个是从a 指向的内存中读取。第二个是写入该内存。

这与x = 和= x 没有区别,只是您不直接访问变量而是访问它指向的对象。

【讨论】:

    【解决方案2】:

    这里:

    t = *a;
    

    指针a 被取消引用,这个值被分配给t 而这里:

    *a = *b;
    

    b 和 a 都被取消引用,*b 的值存储在地址 a 中。

    【讨论】:

      【解决方案3】:

      我听说 = *a 中的 * 运算符是一个取消引用(或间接)运算符,它会获取(?)

      事实上,当您单独使用运算符 * 取消引用指针时,就会发生 fetch。因此,赋值= 运算符不涉及取消引用,或者将取消引用的值分配给 LHS。

      【讨论】:

        【解决方案4】:

        a这里是一个指针,指向一个int。

        *a 检索存储在a 指向的内存中的整数值。当您说*a = &lt;some value&gt; 时,假设&lt;some value&gt; 是int,&lt;some value&gt; 将存储在a 指向的内存位置。

        *a = *b ==> 这里b又是一个int指针,所以b指向的整数值被读写到a指向的内存位置。

        【讨论】:

          【解决方案5】:

          它与'='运算符没有关系。它(*运算符)只是表示'a'地址的值。所以

          t = *a;   assigns value at address a to t
          *a = *b;  assigns b's value in place of value at address a
          *b =  t;  assigns t to b's value 
          

          【讨论】:

            【解决方案6】:

            = *a 和 *a = 有什么区别?

            嗯...看看这段代码:

            int x;
            t = x;
            x = t;
            

            如果你有任何普通变量int x;,那么你可以读取它并写入它。这也是你的两条线之间的区别。

            * 是“内容”运算符。如果a 是指向int 的指针,那么*a 仅仅意味着您可以使用该变量的内容,就好像它是一个普通的int 变量一样。就像任何变量一样,您可以读取或写入它。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-06-27
              • 1970-01-01
              • 2019-01-12
              • 2012-07-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多