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

What is the difference between `*a =` and `= *a`?

在下面的函数中,

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 来告诉她发生了什么。

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

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

When you attach a STAR in front of a pointer variable, that means you fetches(retrieves) the value.

嗯,这可以应用于以下语句。

int t = *a;

可以简单地说,

int t = 10;

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

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

罪魁祸首是我没有尝试解释 dereference operator 或者我没有问我自己意识到 별(star).

的含义

这是人们会说的。

for = *a,

the actual value at the address denoted by a is assigned to the left side.

for *a =

the value of the right side is stored in the address denoted by a.

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

感谢您的回答。


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

这里:

t = *a;

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

*a = *b;

ba 都被取消引用并且 *b 的值存储在地址 a.

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

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

它与'='运算符无关。它(*运算符)只是表示'a'处的值address.So

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 

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

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

指向的内存位置

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

I've heard that the * operator in = *a is a de-referencing(or in-directing) operator which fetches(?)

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

What is the difference between = *a and *a =?

嗯...看看这段代码:

int x;
t = x;
x = t;

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

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