信奥竞赛

系列

剑指信奥 | C++ 之指针

剑指信奥 | C++ 之指针

什么是指针

还记得我们在学习 C++ 的运算符时,在其他运算符的分类中,有一对比较特别的运算符:

  1. & 取址
  2. * 寻址

先不考虑这两个运算符的作用,我们先说一下这里「址」的含义。

如果用「址」组一个词,最容易想到的就是地址,取址和寻址的址就是地址的意思。

地址的含义是标识一个位置,家的地址,学校的地址,有了地址就可以找到家和学校。

在语言中,地址指示的是变量的位置,而变量都在哪呢?我们知道,程序运行在计算机的内存中,所以变量的地址就是一个变量在内存中的位置。

明白了上面的说法,寻址和取址就不难理解了。

取址与指针

在变量定义之后,我们可以使用 & 取址运算符获取这个变量在内存中的地址:

#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++ 语言的指针是语言中的一个难点,同时也是重点,在数据结构和算法中,指针都有大量的使用场景。