1 函数参数传递
从swap函数讲起,如果我是一个新手,我不加思索写下
void swap(int a,int b) {
int c = a;
a = b;
b = c;
}
很显然,这个函数是无效的,正确的写法是
void swap(int * a, int * b) {
int c = *a;
*a = *b;
*b = c;
}
这里我的解释是,函数传参时传入的参数会被复制给形式参数,不管这个传入的参数是整数还是指针(先不考虑union类型)。
在这种解释下,第一个函数无效的原因也找到了,假设一下,在主函数中的代码可以替换成这种形式
//原代码
int main() {
int a = 1, b = 2;
swap(a,b);
return 0;
}
//替换后
int main() {
int a = 1, b = 2;
// swap
int __a = a;
int __b = b;
int c = __a;
__a = __b;
__b = c;
return 0;
}
2.1 函数返回值传递
按照上面的想法,我认为函数返回值也会经过传递,那么这段错误代码可以这样解释
int * foo() {
int a = 1;
return &a;
}
首先调用int * ptr = foo()
时创建一个临时变量 int * __a = &a;调用结束后,ptr = __a
,此时foo内部变量a被回收,所以ptr == NULL
但是我发现一个问题,这个问题反驳了我的猜测
2.2 函数返回值传递 问题
这是一个有问题的代码
// question: a 应该被删除了
int foo() {
int a = 1;
cout<< &a << endl;
return a;
}
int main() {
int a = foo();
cout<< &a << endl;
return 0;
}
问题出在运行结果,本来foo内部的a应该被回收了,但是打出来的两个地址竟然是一样的
(base) ➜ test ./a.out
0x7ffe9fccabc4
0x7ffe9fccabe4
不太怎么懂编译器是怎么运作的,我在想会不会我的想法有问题,请各位帮我解答