试图理解交换两个 int 值的函数
Trying to understand a function to swap two int values
我知道这个函数交换两个 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 被赋值 2 来自指向 y 的取消引用指针。所以,根据 *x = *y,我正在阅读 1=2
非常感谢。
让我们尝试在不使用 "dereference" 这个词的情况下解释 *x = *y;
:
*x
表示x指向的整型对象。由于它是赋值的左操作数,这意味着这个整数对象将被更新。
*y
表示y指向的整型对象。由于它是赋值的右操作数,这意味着整数对象的内容(即它的值)将被使用。
*x=*y
用y指向的整数对象更新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)
当您分配类似 int abc = 5; int *ptr = &abc;
的内容时,请理解:
ptr
是整数指针
&abc
是变量的地址abc
ptr
存储变量的地址 abc
- 写
*ptr
等同于写 abc
,与写 5
(常量)不同,尽管这三个表达式在表达式中的计算结果都是 5
.
*
运算符取消引用为您提供变量,其地址由 ptr
(即 abc
)指向。因此它可以用作左值(在赋值的左侧)。
现在在您的示例中,当您尝试赋值 x = *y
时,您试图将 y
指向的值(它是一个整数值)存储到 x
(它需要一个地址)。
现在假设您以某种方式进行了分配,让我们还假设 &y
(即 y 的地址)类似于 1056
(仅出于示例目的)并且 [= 指向的值24=] 类似于 5
。那么从现在开始x
指向地址location5
(不是实际地址),从而产生一些垃圾值。
现在像 x = y
这样的作业可以完美运行了。但这会使指针 x
指向与 y
指向的相同位置交换它们的指向。也就是说,如果最初 x
指向位于地址 1000
的变量 a
并且 y
指向位于地址 [=] 的变量 b
40=] ,在 x
和 y
的赋值之后将是 1000
。这只意味着现在我们有两个指针指向地址2000
处的变量b
,但对实际变量没有影响。
而写 *x = *y
等同于写 a = b
希望对您有所帮助。
- 在
swap(&x, &y);
中,您将变量 x 和 y 的地址作为参数传递给函数 swap(int* x, int* y)
。
由于swap函数的参数是int指针,x和y的地址现在存储在另一个int指针类型的变量x
和y
.
笔记:
x 和 y 在两个函数中巧合地具有相同的名称,但是 swap 函数中使用的 x
和 y
是 int 指针,而 x
和y
在交换函数之外使用的是 int
个变量。
The value 1 from a dereferenced pointer to x is assigned the value 2 from a dereferenced pointer to y. So, by *x = *y, I'm reading 1=2
*x=*y
实际上是使用具有从左到右结合性的赋值运算符。赋值运算符将右操作数的值赋给左操作数。不要读成1=2,以后可能会证明有问题。
I tried to make some assumptions. By *x = *y, I think *x is not dereferencing x, but is the adress of x, and this is getting assigned the value 2 of the dereferenced pointer to y.
*x=*y
在这里,*x
是 x 的值而不是 x 的地址,如第 3 点所述,该语句将把 *y
的值即 2 赋值给*x
.
But why, instead of *x=*y, shouldn't it just be x=*y?
不应该,因为 x
是一个 int
指针而 *y
是一个 int
变量。
我知道这个函数交换两个 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 被赋值 2 来自指向 y 的取消引用指针。所以,根据 *x = *y,我正在阅读 1=2
非常感谢。
让我们尝试在不使用 "dereference" 这个词的情况下解释 *x = *y;
:
*x
表示x指向的整型对象。由于它是赋值的左操作数,这意味着这个整数对象将被更新。*y
表示y指向的整型对象。由于它是赋值的右操作数,这意味着整数对象的内容(即它的值)将被使用。*x=*y
用y指向的整数对象更新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)
当您分配类似 int abc = 5; int *ptr = &abc;
的内容时,请理解:
ptr
是整数指针&abc
是变量的地址abc
ptr
存储变量的地址abc
- 写
*ptr
等同于写abc
,与写5
(常量)不同,尽管这三个表达式在表达式中的计算结果都是5
.
*
运算符取消引用为您提供变量,其地址由 ptr
(即 abc
)指向。因此它可以用作左值(在赋值的左侧)。
现在在您的示例中,当您尝试赋值 x = *y
时,您试图将 y
指向的值(它是一个整数值)存储到 x
(它需要一个地址)。
现在假设您以某种方式进行了分配,让我们还假设 &y
(即 y 的地址)类似于 1056
(仅出于示例目的)并且 [= 指向的值24=] 类似于 5
。那么从现在开始x
指向地址location5
(不是实际地址),从而产生一些垃圾值。
现在像 x = y
这样的作业可以完美运行了。但这会使指针 x
指向与 y
指向的相同位置交换它们的指向。也就是说,如果最初 x
指向位于地址 1000
的变量 a
并且 y
指向位于地址 [=] 的变量 b
40=] ,在 x
和 y
的赋值之后将是 1000
。这只意味着现在我们有两个指针指向地址2000
处的变量b
,但对实际变量没有影响。
而写 *x = *y
等同于写 a = b
希望对您有所帮助。
- 在
swap(&x, &y);
中,您将变量 x 和 y 的地址作为参数传递给函数swap(int* x, int* y)
。 由于swap函数的参数是int指针,x和y的地址现在存储在另一个int指针类型的变量
笔记:x
和y
.x 和 y 在两个函数中巧合地具有相同的名称,但是 swap 函数中使用的
x
和y
是 int 指针,而x
和y
在交换函数之外使用的是int
个变量。The value 1 from a dereferenced pointer to x is assigned the value 2 from a dereferenced pointer to y. So, by *x = *y, I'm reading 1=2
*x=*y
实际上是使用具有从左到右结合性的赋值运算符。赋值运算符将右操作数的值赋给左操作数。不要读成1=2,以后可能会证明有问题。I tried to make some assumptions. By *x = *y, I think *x is not dereferencing x, but is the adress of x, and this is getting assigned the value 2 of the dereferenced pointer to y.
*x=*y
在这里,*x
是 x 的值而不是 x 的地址,如第 3 点所述,该语句将把*y
的值即 2 赋值给*x
.But why, instead of *x=*y, shouldn't it just be x=*y?
不应该,因为
x
是一个int
指针而*y
是一个int
变量。