来看一道题目
void swap(int *a, int *b) {
int *t;
t = a;
a = b;
b = t;
}
int main()
{
int x = 1, y = 2;
int *p = &x, *q = &y;
swap(p, q);
printf("%d %d\n", *p, *q);
return 0;
}
这里的swap是失败的,这个题目很经典,也应该很快能得到正确的swap函数
void swap(int *a, int *b) {
int t;
t = *a;
*a = *b;
*b = t;
}
那么为什么上面是错的呢?
这涉及到了指针传递的错误
指针传递又叫做地址传递,形参为指向实参地址的指针,当对形参的指向操作时,就相当于操作实参本身。
第一段代码的swap(p,q)传递的不是地址,而是变量,如果想用指针传递的话应该用swap(&p,&q)
非得这么做的做法(很作死,但是探究后明白的更深入了)
#include <stdio.h>
#include <string.h>
void swap(int **a, int **b) {
int *t;
t = *a;
*a = *b;
*b = t;
}
int main()
{
int x = 1, y = 2;
int *p = &x, *q = &y;
swap(&p,&q);//在函数中执行
printf("%d %d\n", *p, *q);
int *t;//在main执行
t=p;
p=q;
q=t;
printf("%d %d\n", *p, *q);
return 0;
}