指针、函数、引用
交换两个参数的值:函数参数分别使用值传递、地址传递、引用传递
值传递
void Swap(int x, int y)
{
int tmp;
tmp = x;
x = y;
y = tmp;
printf("x = %d, y = %d\n", x, y);
}
main()
{
int a = 42,b = -7;
Swap(a, b);
printf("a = %d, b = %d\n", a, b);
return(0);
}
从上面的讲解看,这种方式无法交换两个参数的值
地址传递
void Swap(int *px, int *py)
{
int tmp = *px;
*px = *py;
*py = tmp;
printf("*px = %d, *py = %d.\n", *px, *py);
}
main()
{
int a = 42;
int b = -7;
Swap(&a, &b);
printf("a = %d, b = %d.\n", a, b);
return(0);
}
根据我上期讲的内容:指针1:引入指针、 *和&运算符 、 指针类型
指针是一个4个字节(32位操作系统)的内存空间,存储的是一个地址,我们用* 号来取这个地址所存的值,至于我们要取的是一个int类型还是double,还是什么其他类型,由我们调用时决定。先不管取地址的事,总之我们知道调用Swap时Swap函数栈帧内新定义了两个指针,px,py,分别赋值为mian函数栈帧中a的地址和b的地址。在Swap函数栈帧我们用解引用操作符交换*px,*py。注意,px.py的值没有变,还是a的地址,b的地址。但是,a的地址上,b的地址上存的值改变了。
具体函数调试过程见参考资料28-43页:https://courses.cs.washington.edu/courses/cse333/22sp/lectures/03-c-pointers.pdf
引用传递
void Swap(int &x, int &y)
{
int tmp = x;
x = y;
y = tmp;
printf("x = %d,y = %d\n", x, y);
}
main()
{
int a = 4;
int b = 6;
Swap(a, b);
printf("a = %d, b = %d\n", a, b);
return(0);
}
引用(c++)
当变量被声明为引用时,它将成为现有变量的替代名称。变量可以通过在声明中加上“&”来声明为引用。虽然名字不一样,但是他们指向的空间是一样的,大小也一样。不信看看这个例子:
void Swap(int& x, int& y)
{
printf("x = %d, y = %d\n", x, y);
cout << "&x=" << &x << " " << "&y=" << &y << endl;
int tmp = x;
x = y;
y = tmp;
printf("x = %d, y = %d\n", x, y);
cout << "&x="<< &x << " " << "&y=" << &y << endl;
}
int main()
{
int a = 4;
int b = 6;
printf("a = %d, b = %d\n", a, b);
cout << "&a="<< & a <<" " << "&b=" << &b << endl;
Swap(a, b);
printf("a = %d, b = %d\n", a, b);
cout << "&a=" << &a << " " << "&b=" << &b << endl;
return(0);
}
运行结果如下:
引用发明的最大好处是节省了二级甚至多级指针使用的困难,使代码更加简洁易懂。
参考资料:
《彻底搞定c指针》
《程序是怎样跑起来的》第10章
https://courses.cs.washington.edu/courses/cse333/22sp/lectures/03-c-pointers.pdf