试图了解交换两个int值的函数

时间:2018-09-07 12:15:43

标签: c pointers swap

我知道此函数交换两个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

非常感谢。

3 个答案:

答案 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的变量1000y指向地址{{ 1}},在b2000的赋值之后均为x。这仅意味着现在我们在地址y有两个指向变量1000的指针,但对实际变量没有影响。 而写b等同于写2000

希望这会有所帮助。

答案 2 :(得分:0)

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

    注意:

    x和y在两个函数中的名称相同,但是交换函数中使用的xy是int指针,而x和{{1} }在交换函数之外使用的是y变量。

  3.   

    从已取消引用的指针指向x的值1被分配了从已取消引用的指针指向y的值2。因此,通过* x = * y,我正在读取1 = 2

    int实际上是使用具有左至右关联性的赋值运算符。赋值运算符将右操作数的值分配给左操作数。不要将其读取为1 = 2,因为稍后可能会出现问题。

  4.   

    我试图做出一些假设。通过* x = * y,我认为* x并不是对x的解引用,而是x的地址,并且这将被赋值为y的解引用指针的值2。

    *x=*y在这里,*x=*y是x的值,而不是x的地址,如第3点所述,该语句会将*x的值即2分配给{{ 1}}。

  5.   

    但是为什么不是* x = * y而不是x = * y?

    这不应该是因为*y*x指针,而xint变量。