起因
种种原因,今天手写了一个整数交换的函数void swap(int *, int *),本以为很简单,结果引发了很多思考。先上代码,注意,这个代码是错误的,错误的,错误的...
void swap1(int *a, int *b) {
int *temp = a;
a = b;
b = temp;
}
然后是main
int main(int argc, const char * argv[]) {
// insert code here...
printf("Hello, Test C!\n");
int a = 10;
int b = 2;
swap1(&a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
运行
image.png
看到运行结构后,第一反映应该是swap函数写的不对。然后就去看swap函数实现。
错误点
正确代码
void swap2 (int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
对比代码后,意识到,其实自己对指针还是学习的不够深。
原因
现在我们队代码加上一些注释,先看看错误代码的运行结果:
void swap1(int *a, int *b) {
printf("begin a = %p, b = %p\n", a, b);
int *temp = a;
a = b;
b = temp;
printf("end a = %p, b = %p\n", a, b);
}
int main(int argc, const char * argv[]) {
// insert code here...
printf("Hello, Test C!\n");
int a = 10;
int b = 2;
printf("&a = %p, &b = %p\n", &a, &b);
swap1(&a, &b);
printf("&a = %p, &b = %p\n", &a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
image.png
问题点在于,我交换的是形参的指针,而不有交换指针指向的值。
我们来看看正确代码的打印结果
void swap2 (int *a, int *b) {
printf("begin a = %p, b = %p\n", a, b);
int temp = *a;
*a = *b;
*b = temp;
printf("end a = %p, b = %p\n", a, b);
}
int main(int argc, const char * argv[]) {
// insert code here...
printf("Hello, Test C!\n");
int a = 10;
int b = 2;
printf("&a = %p, &b = %p\n", &a, &b);
swap2(&a, &b);
printf("&a = %p, &b = %p\n", &a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
image.png
形参指针没有交换,交换的是指针指向的值。
看来自己对指针还是理解的不够深啊。
网友评论