以下为个人理解,仅供参考
三种变量,代码示例
#include <iostream>
int main()
{
int val = 10; /// 普通变量
int &quo = val; /// 引用变量
int *ptr = &val; /// 指针变量
std::cout << std::endl;
std::cout << std::endl;
std::cout << "普通变量 val 的值: val = " << val << std::endl;
std::cout << "普通变量 val 地址:&val = " << &val << std::endl;
std::cout << std::endl;
std::cout << "引用变量 quo 的值: quo = " << quo << std::endl;
std::cout << "引用变量 quo 地址:&quo = " << &quo << std::endl;
std::cout << std::endl;
std::cout << "指针变量 ptr 的值: ptr = " << ptr << std::endl;
std::cout << "指针变量 ptr 地址:&ptr = " << &ptr << std::endl;
std::cout << std::endl;
std::cout << "指针变量 ptr 指向的变量的值: *ptr = " << *ptr << std::endl;
std::cout << "指针变量 ptr 指向的变量的地址:&(*ptr) = " << &(*ptr) << std::endl;
std::cout << std::endl;
std::cout << std::endl;
std::cout << std::endl;
return 0;
}
一个变量是由数值和地址这两个元素共同构成的。
从上图中我们可以看到,
1. 引用变量 quo
与 普通变量 val
是完全等价的,两者的数值和地址都相等。
也就是说 quo 只是 val 的一个别名、小名。比如说张三的小名叫张小三,显然张三和张小三都是指同一个人。这里的 符号&
可以认为是取小名的标识,而不是取地址的意思
2. *ptr
等于 变量 val
的数值,&(*ptr)
等于 变量 val
的地址。
3. 而 指针变量 ptr
作为一个变量,它也拥有自己的数值和地址,且 指针变量ptr
的值是 普通变量 val 的地址
。这就是我们通常说的 指针变量 ptr
指向了 普通变量 val
。
下面解析三种变量
符号
&
:引用
符号*
:解引用
int val = 10; /// 普通变量
int &quo = val; /// 引用变量
int *ptr = &val; /// 指针变量
请遵循以下两个原则(后面解释会用到)
- quo 是变量,ptr 也是变量 (且不同于 *ptr)
- 每个变量都有自己的地址和存储的值
关于引用 &
int &quo = val
:意为 quo
是 val
的别名(alias),比如说张三的小名叫张小三,显然张三和张小三都是指同一个人。这里的 符号&
可以认为是取小名的标识,而不是取地址的意思。
关于指针及解引用 *
int *ptr = &val
:意为变量 val
的地址赋给变量 ptr
(遵循原则1),所以 ptr
的值存的是一个地址 (遵循原则2)。
而解引用符合*
的作用就是根据地址找到对应的值。
*ptr
理解为根据 ptr
的值 (存的是 val
的地址) 对应的值。也就是说根据变量 val
的地址找对应的值,这个值就是 val
的值 10
啊。