1. 代码示例
先来看一段简单的代码:
int a = 10;
int * p;
p = &a;
cout << a << endl;
cout << &a << endl;
cout << p << endl;
cout << *p << endl;
2. 逐行解析
int a = 10;
定义一个int型变量a。
计算机在内存中自动找到一块空间,这块空间取名为a,把你给a赋的值存储在这个空间里。
int * p;
定义一个指向int型变量的指针p。
p = &a;
指针p指向变量a。&a
表示a的地址。p = &a;
表示变量a的存储单元的地址存入到p存储单元中,即p中存储的是a的地址。
(假设a的地址为0x100)
cout << a << endl;
输出:10
cout << &a << endl;
输出:0x0100
cout << b << endl;
输出:0x0100
cout << *b << endl;
输出:10
3. 总结
-
a
表示a对应的存储单元中的数据; -
&a
表示a对应的存储单元的地址; -
*p
表示p中存储的地址对应的存储单元中的数据。
首先,要求p中对应的存储单元中的数据必须是另一个存储单元的地址。于是*p表示另一个存储单元中的数据,访问*p就是访问此数据。 -
int a;
表示变量a声明的类型是int;
a中存储的是一个int型数值;
通过a可以访问(读取或修改)这个数值。 -
int * p;
表示变量p声明的类型是int * ,是一个int型指针变量。
p中存储的是一个存储单元的地址,而此存储单元存储的数据是一个int型数值。
通过* p可以访问(读取或修改)这个数值。 -
a == &* a:a是一个指针,存储的是地址
a == * &a:a是一个普通变量,存储的是数值、字符等 -
int ** a;
a中存储的是一个存储单元的地址,而该存储单元中存储的数据是另外一个存储单元的地址,另外一个存储单元中存储的是一个整型数值;
通过**a可以访问(读取或修改)这个数值。