我知道此函数交换两个int值,但我试图理解它 每分钟 * x = * y 到底在做什么。
1 void swap (int* x, int* y){
2 int temp = *x;
3 *x = *y;
4 *y = temp;
5 }
6
7 int x,y;
8 x = 1;
9 y = 2;
10 swap(&x,&y)
该函数接收两个地址,分别是 x 和 y 。
已创建一个int变量 temp ,并已从指向x的取消引用的指针中为其分配了值 1 。
从已取消引用的指针到 x 的值 1 被赋予从 y 取消引用的指针的值 2 >。因此,通过 * x = * y ,我正在阅读 1 = 2
非常感谢。
答案 0 :(得分:1)
让我们尝试不使用“取消引用”一词来解释*x = *y;
:
*x
表示x指向的整数对象。由于它是赋值的左操作数,因此意味着将更新此整数对象。*y
表示y指向的整数对象。由于它是赋值的正确操作数,因此意味着将使用整数对象的内容(即其值)。*x=*y
用x指向的整数对象更新x指向的整数对象。 注意:为了清楚地将指针与代码中的其他类型区分开,建议您按以下方式更改命名,例如使用p_
之类的前缀作为指针变量:
1 void swap (int* p_x, int* p_y){
2 int temp = *p_x;
3 *p_x = *p_y;
4 *p_y = temp;
5 }
6
7 int x,y;
8 x = 1;
9 y = 2;
10 swap(&x,&y)
答案 1 :(得分:0)
分配int abc = 5; int *ptr = &abc;
之类的内容时,请注意:
ptr
是整数指针&abc
是变量abc
ptr
存储变量abc
的地址*ptr
与写abc
是等效的,尽管写三个表达式在表达式中都等于5
,写5
与写*
(常量)并不相同。 / li>
ptr
运算符将取消引用,以为您提供变量,该变量的地址由abc
指向(即x = *y
)。因此,它可以用作左值(在作业的左侧)。
现在在您的示例中,当您尝试分配y
时,您正试图将x
所指向的值(是整数值)存储到&y
(期望有一个地址)。
现在假设您以某种方式进行了分配,让我们还假设1056
(即y的地址)类似于y
(仅出于示例目的)和{{1}所指向的值}类似于5
。然后从现在开始x
指向地址位置5
(这不是实际地址),从而产生一些垃圾值。
现在,像x = y
这样的作业可以正常工作。但这会使指针x
指向与y
所指向的位置相同的位置,从而交换其指向。就是说,如果最初x
指向地址a
的变量1000
且y
指向地址{{ 1}},在b
和2000
的赋值之后均为x
。这仅意味着现在我们在地址y
有两个指向变量1000
的指针,但对实际变量没有影响。
而写b
等同于写2000
希望这会有所帮助。
答案 2 :(得分:0)
swap(&x, &y);
中,您将变量x&y的地址作为参数传递给函数swap(int* x, int* y)
。由于交换函数的参数是int指针,因此x和y的地址现在存储在另一个int指针类型变量x
和y
中。
x和y在两个函数中的名称相同,但是交换函数中使用的x
和y
是int指针,而x
和{{1} }在交换函数之外使用的是y
变量。
从已取消引用的指针指向x的值1被分配了从已取消引用的指针指向y的值2。因此,通过* x = * y,我正在读取1 = 2
int
实际上是使用具有左至右关联性的赋值运算符。赋值运算符将右操作数的值分配给左操作数。不要将其读取为1 = 2,因为稍后可能会出现问题。
我试图做出一些假设。通过* x = * y,我认为* x并不是对x的解引用,而是x的地址,并且这将被赋值为y的解引用指针的值2。
*x=*y
在这里,*x=*y
是x的值,而不是x的地址,如第3点所述,该语句会将*x
的值即2分配给{{ 1}}。
但是为什么不是* x = * y而不是x = * y?
这不应该是因为*y
是*x
指针,而x
是int
变量。