在以下功能中,
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
表示的地址 中。
这令我感到困惑。这就是为什么我应该重新思考“解除引用”的含义。
感谢您的回答。
哦,我认为这个问题正在深入探讨lvalue
和rvalue
的概念。
答案 0 :(得分:3)
第一个是从内存a
读取指向。第二个是写那个记忆。
这与x =
和= x
没有什么不同,只是你没有直接访问变量,而是它所指向的对象。
答案 1 :(得分:2)
下面:
t = *a;
取消引用指针a
,并将此值分配给t
,而这里:
*a = *b;
取消引用b
和a
,*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变量一样。就像任何变量一样,你可以读或写它。