还记得我们在学习 C++ 的运算符时,在其他运算符的分类中,有一对比较特别的运算符:
&
取址*
寻址先不考虑这两个运算符的作用,我们先说一下这里「址」的含义。
如果用「址」组一个词,最容易想到的就是地址,取址和寻址的址就是地址的意思。
地址的含义是标识一个位置,家的地址,学校的地址,有了地址就可以找到家和学校。
在语言中,地址指示的是变量的位置,而变量都在哪呢?我们知道,程序运行在计算机的内存中,所以变量的地址就是一个变量在内存中的位置。
明白了上面的说法,寻址和取址就不难理解了。
在变量定义之后,我们可以使用 &
取址运算符获取这个变量在内存中的地址:
#include <iostream>
using namespace std;
int main() {
string food = "Pizza";
cout << food << endl;
// 输出 food 的地址
cout << &food << endl;
return 0;
}
/*
output:
Pizza
0x7ffee6366e08
*/
我们看到了,变量的地址是一个用十六进制表示的整数值。
我们也可以在变量声明之后,把它的地址赋值给另外一个变量,这个另外的变量就存储了这份地址,它就是我们今天要说到的 指针 pointer:
#include <iostream>
using namespace std;
int main() {
string food = "Pizza";
// 指针变量 p
string* p = &food;
cout << p << endl;
return 0;
}
/*
output:
0x7ffee6366e08
*/
这里的 p
就是指针变量:
在计算机科学中,指针(英语:Pointer),是程序语言中的一类数据类型及其变量,用来表示或储存一个内存地址,这个地址的值直接指向(points to)存在该地址的对象的值。
Wikipedia
要注意在定义指针变量时,数据类型要与指向地址中的变量类型一致,并且在数据类型的后面有一个符号 *
。
通过这个过程,指针 p
就存储了变量 food
的内存地址。
既然有了变量的地址,就可以沿着这个地址找到这个变量存储的地方,进而获取这个变量的值,这个过程就叫做 寻址:
#include <iostream>
using namespace std;
int main() {
string food = "Pizza";
string* p = &food;
// 寻址,输出变量值
cout << *p << endl;
return 0;
}
/*
output:
Pizza
*/
这里,*
就是间接寻址运算符。
C++ 语言的指针是语言中的一个难点,同时也是重点,在数据结构和算法中,指针都有大量的使用场景。