使用指针交换

时间:2016-09-07 14:02:42

标签: c pointers

在下面的代码中,为了在pxpy之间进行切换,您需要一个指向pypx地址的指针来有效地交换它们。

我的问题是int temppx的值被放入其中时它如何返回正确的值,因为没有指向它的指针能够给出正确的值int temp的地址如何不能克隆给出错误的值?

void swap(int px, int py)
{
    int temp;
    temp = px;
    px = py;
    py = temp;
}

//pointer version

void swap(int *px, int *py)
{
    int temp;
    temp = *px;
    *px = *py;
    *py = temp;
}

3 个答案:

答案 0 :(得分:1)

两个函数都交换int值。但这种交换是否会影响调用代码的int s?

使用第二个swap()时,交换的效果会在原始a,b中看到,因为该函数与原始 a,b的地址一起使用。

int a = 1;
int b = 2;
swap_version2(&a, &b);
printf("%d %d\n", a, b);  // prints 2 1

使用第一个swap(),交换的效果在原始c,d中看不到 。因为swap()函数正在交换c,d的副本。净效应:第一个交换功能只是浪费时间。它不会交换c,d

int c = 3;
int d = 4;
swap_version1(c, d);
printf("%d %d\n", c, d);  // prints 3 4

答案 1 :(得分:1)

您需要了解两件重要事项。

1)在C中调用函数时,参数总是按值传递。如果对函数中的进行更改以保存传递的值,则更改将在函数返回时丢失。换句话说 - 在函数外部看不到函数内部的任何更改。

2)使用指针时,指针前面的*运算符意味着the location pointed to by the pointer。它被称为解除引用指针。因此,如果您执行*px = 5;,则更改任何指针值!您更改指针指向的位置的值。

仔细查看您的代码:

在你的第一个例子中,你有类似的东西:

void swap(int px, int py)
{
    int temp;
    temp = px;
    px = py;
    py = temp;
}

int main(void)
{
    int x = 10;
    int y = 100;
    swap(x, y);
    printf("%d %d\n", x, y);
    return 0;
 }

在C中,所有内容都按值传递。因此,当您致电swap时,传递给该函数的值为10100。变量xy 。换句话说,函数中的pxpyx中的变量ymain无关。这意味着当函数返回且pxpy 更改时,对变量xy所做的任何更改都将丢失。< / p>

你的第二个例子是这样的:

void swap(int px, int py)
{
    int temp;
    temp = *px;
    *px = *py;
    *py = temp;
}

int main(void)
{
    int x = 10;
    int y = 100;
    swap(&x, &y);  // Notice the & operator
    printf("%d %d\n", x, y);
    return 0;
 }

一如既往,我们有价值的传递。但在这种情况下,您传递的值是两个pointer to int的值。更具体地说,您传递了xy的地址。

就像之前你无法改变传递给函数的一样(就像第一个例子一样)但你可以改变指针所代表的值指着。

在这里,您需要知道指针前面的*访问指针所指向的内容。

这样做temp = *px将读取px指向的值。在这种情况下,它是10,因此temp获取值10

执行*px = *py读取值py指向(即100),并将其放在px点(即x main100现在{{{ 1}})。

执行*py = temp读取值temp保持(即10)并将其放在py点(即y main10的位置{{1 }})。

因此,当函数返回时,xy的值已被交换。

请注意,代码从不使用指向temp的地址(也称为地址)。变量temp仅用作普通int

答案 2 :(得分:0)

在此功能中

void swap(int *px, int *py)
{
    int temp;
    temp = *px;
    *px = *py;
    *py = temp;
}

pxpy指向交换的值。该函数不会交换指针本身。

要交换指针指向的值,您需要一个中间内存,其中临时存储px指向的值,该值将被py指向的值覆盖。

因此,该函数使用临时存储值temp的本地变量*px

请注意此作业声明中的内容

temp = *px;

变量temp存储px指向的*px类型int的值。它不是指向px的指针temp本身。