征服C指针2-swap(int a,int b)为什么失效?

要实现交换两个变量x,y的值,我们会声明构造一个swap子函数来实现。

假如我们采取这种方式:

#include <stdio.h>
#include <stdlib.h>

void main()
{
    void swap(int a, int b);
    int x, y;
    x = 5;
    y = 10;
    printf("交换前,x...%d,   y....%d\n", x, y);
    printf("交换前x地址...%p,   y地址....%p\n", &x, &y);
    swap(x, y);
    printf("交换后,x地址...%p,   y地址....%p\n", &x, &y);
    printf("交换后,x...%d,   y....%d\n", x, y);
    system("pause");
}
void swap(int a,int b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
    printf("交换后,a...%d,   b....%d\n", a, b);
}
//相当于把x的值复制了一份给swap里面,以供其赋值。然而本身x,y其内存空间以及对应的值没有发生变化

其运行结果如下:

交换前,x...5,   y....10
交换前x地址...000000E0DF2FFC84,   y地址....000000E0DF2FFCA4
交换后,a...10,   b....5
交换后,x地址...000000E0DF2FFC84,   y地址....000000E0DF2FFCA4
交换后,x...5,   y....10
请按任意键继续. . .
 

我们发现,x,y的值并没有交换,其实,这里swap函数只是相当于利用x,y的值进行了赋值,而x,y其地址,及其地址上的值都没有变化。

也可以说相当于把x的值复制了一份给swap里面a,以供其赋值。所以a,b交换了,而实参没有。

这时候我们会用指针的形式,使得其地址上发生根本变化。

代码如下:

#include <stdio.h>
#include <stdlib.h>

void main()
{
    void swap(int *a, int *b);
    int x, y;
    x = 5;
    y = 10;
    printf("交换前,x...%d,   y....%d\n", x, y);
    printf("交换前x地址...%p,   y地址....%p\n", &x, &y);
    swap(&x, &y);
    printf("交换后,x地址...%p,   y地址....%p\n", &x, &y);
    printf("交换后,x...%d,   y....%d\n", x, y);
    system("pause");
}
void swap(int *a, int *b)
{
    int temp;
    temp=*a;
    *a = *b;
    *b = temp;
    printf("交换后,a...%d,   b....%d\n", &a,&b);
}
//可谓釜底抽薪,因为尽管地址值也是复制的形式给了swap赋值,但是一旦地址值给了swap,这样直接操作地址就会真正的改变它;
//比如这是原来x的地址值:000000E0DF2FFC84,当赋值一份给swap里面的a后,*(000000E0DF2FFC84)=*b,就会改变地址对应的值。从而使得x的值变成了10.

原因就是:同样是赋值一份信息过去,但是改变了地址,就会真正的改变那个地址上的东西

猜你喜欢

转载自blog.csdn.net/bufengzj/article/details/81301341
int