计算机程序在存储数据时必须跟踪三种基本属性:
- 数据是什么
类型
- 信息在存储器中的
地址
- 存储的
值
是多少
众所周知,对于常规变量a,&a
是存储地址,a是值。对于指针变量p,p是存储地址,*p
则是值。下面通过一个例子来辨析取值符&
和间接值*
(indirect value)
#include <iostream>
using namespace std;
///* & 辨析
int main()
{
int a;
a=10;
cout<<&a<<endl;
int & b=a;//这里的b是一个reference,初始化时必须赋值。
cout<<&b<<":"<<b<<endl;
int* c=&a;//同类型之间才能赋值,&a是(int*)类型
cout<<c<<":"<<*c<<endl;
return 0;
}
/*output
0x28ff04
0x28ff04:10
0x28ff04:10
*/
/*a和b区别:
(gdb) p a
$2 = 10
(gdb) p &b
$3 = (int *) 0x400970
(gdb) p b
$4 = (int &) @0x7fffffffe55c: 10
*/
可以看出,b不是真正意义上的int类型,但是可以当作int用。&b就是(int*)
所以我们要想在参数传递中修改实参的值,就要通过[1]中Exchg2 (int &x=a,int &y=b)
或者Exchg3(int* x=&a,int* y=&b)
。 明白这一点之后,指向指针的指针也好理解了。
REF
- [1] 基础系列(关于实参,形参,以及指针)
- [2] c++ primer plus,引用变量, p255