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

时间:2015-06-18 09:54:38

标签: c pointers dereference lvalue rvalue

在以下功能中,

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年。) 我使用printf%d%p来展示她发生了什么。

然后我犯了一个可怕的错误。我宣布

  

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

     

在指针变量前附加 STAR 时,表示您获取(检索)该值。

那可以应用于以下声明。

int t = *a;

简单地说,

int t = 10;

我遇到的一个大问题来自第二个陈述。

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

根本的罪恶是我没有尝试解释 dereference operator 或者我没有问自己是了解 별(星级) 的含义。

这是人们会说的。

  

代表= *a

     

a表示的地址的实际值 已分配到左侧。

     

代表*a =

     

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

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

感谢您的回答。

哦,我认为这个问题正在深入探讨lvaluervalue的概念。

6 个答案:

答案 0 :(得分:3)

第一个是从内存a读取指向。第二个是写那个记忆。

这与x == x没有什么不同,只是你没有直接访问变量,而是它所指向的对象。

答案 1 :(得分:2)

下面:

t = *a;

取消引用指针a,并将此值分配给t,而这里:

*a = *b;

取消引用ba*b的值存储在地址a中。

答案 2 :(得分:1)

与&#39; =&#39;无关。运算符.It(*运算符)仅表示“地址”的值。所以

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 

答案 3 :(得分:1)

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

*a检索存储在a指向的内存中的整数值。当您说*a = <some value>时,假设<some value>int,则<some value>会存储在a指向的内存位置。

*a = *b ==&gt;这里b又是一个int指针,因此b指向的整数值被读取并写入a指向的内存位置。

答案 4 :(得分:1)

  

我听说* * a中的*运算符是取消引用(或引导)运算符,它取(?)

实际上,当您仅使用运算符*取消引用指针时会发生提取。因此,赋值=运算符不参与解除引用可能将解除引用的值分配给LHS。

答案 5 :(得分:1)

  

= * a和* a =?

之间有什么区别

好吧......看看这段代码:

int x;
t = x;
x = t;

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

*是&#34;&#34;的内容运营商。如果a是指向int的指针,则*a只表示您可以使用该变量的内容,就好像它是一个普通的int变量一样。就像任何变量一样,你可以读或写它。