试图理解交换两个 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)

函数接收两个地址,xy对应。

创建了一个 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=] ,在 xy 的赋值之后将是 1000。这只意味着现在我们有两个指针指向地址2000处的变量b,但对实际变量没有影响。 而写 *x = *y 等同于写 a = b

希望对您有所帮助。

  1. swap(&x, &y); 中,您将变量 x 和 y 的地址作为参数传递给函数 swap(int* x, int* y)
  2. 由于swap函数的参数是int指针,x和y的地址现在存储在另一个int指针类型的变量xy.

    笔记:

    x 和 y 在两个函数中巧合地具有相同的名称,但是 swap 函数中使用的 xy 是 int 指针,而 xy 在交换函数之外使用的是 int 个变量。

  3. 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,以后可能会证明有问题。

  4. 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.

  5. But why, instead of *x=*y, shouldn't it just be x=*y?

    不应该,因为 x 是一个 int 指针而 *y 是一个 int 变量。