使用指针交换变量。有什么区别?(C语言程序设计)

问题描述 投票:-3回答:1

这两个函数有什么区别?能不能通过一个例子来说明?先谢谢你了。

一个是用变量交换变量,另一个是用指针做同样的事情而已。我得到的是其中一个是错误的,但哪个是错误的,为什么?

void swap1(int x, int y) {
  int temp;
  
  temp = x;
  x = y;
  y = temp;
}


void swap2(int *p1, int *p2) {
  int temp;
  
  temp = *p1;
  *p1 = *p2;
  *p2 = temp;
}
c pointers variables swap
1个回答
1
投票

这和指针的概念有关。考虑一下下面的程序(只是添加了一些信息性的代码)。

#include <stdio.h>

void swap1(int x, int y) {
    printf("swap1 : xaddr = %p yaddr = %p\n", &x, &y);

    printf("swap1: %d %d\n", x, y);

    int temp;
    temp = x;
    x = y;
    y = temp;

    printf("swap1: %d %d\n", x, y);
}


void swap2(int *p1, int *p2) {
    printf("swap2 : xaddr = %p yaddr = %p\n", p1, p2);

    int temp;
    temp = *p1;
    *p1 = *p2;
    *p2 = temp;
}

int main()
{
    int x = 10, y = 20;

    printf("main: xaddr = %p yaddr = %p\n", &x, &y);

    swap1(x, y);

    printf("main after swap1 : %d %d\n", x, y);

    swap2(&x, &y);

    printf("main after swap2: %d %d\n", x, y);

    return 0;
}

变量 xy 的本地函数栈中。main()swap1 调用,只是传递了值的副本,而不是实际的地址。xy 的值。所以,交换操作只是发生在本地的值之间。swap1. 而在以下情况下: swap2,实际的地址正在被传递。因此,你对该地址进行的任何操作都会反映在 main() 也。

输出。

main: xaddr = 0x7ffda2efc05c yaddr = 0x7ffda2efc058
swap1 : xaddr = 0x7ffda2efc02c yaddr = 0x7ffda2efc028
swap1: 10 20
swap1: 20 10
main after swap1 : 10 20
swap2 : xaddr = 0x7ffda2efc05c yaddr = 0x7ffda2efc058
main after swap2: 20 10

从输出中可以看出... xymain 异于 swap1,而交换行动确实发生在。swap1但它只是本地的 swap1. 而在 swap2,我们在同一个地址上操作,这是 main 视作 xy,所以操作是永久性的。

© www.soinside.com 2019 - 2024. All rights reserved.