地址与指针

地址与指针#

需求

简单理解地址与指针的概念。

提示

视频

在内存中保存的任何东西都有一个 地址。例如:

int var = 17;

这段代码为变量 var 分配一段 “int 大小” 的内存,并将值 17 保存到这段内存中。

可以保存和操作地址。保存地址的对象(即一块内存或者说是一个内存字节序列)被称为 指针。例如,用于保存 int 的地址的类型称为“指向 int 的指针”或“int 指针”,其表示方法为 int*

int* ptr = &var // ptr 保存 var 的地址

地址运算符 & 用于获得一个对象的地址。

每种类型都有对应的指针类型。例如:

int x = 17;

int* pi = &x; // int 指针
pi
@0x7fff19cd14f8
double e = 2.14143;

double* pd = &e; // double 指针
pd
@0x7fff19cd14f8

查看指向的对象的值,可以使用 “内容”运算符 * (这是一元运算符)。

*pi
17
*pd
2.1414300

内容运算符 (常称为 解引用 运算符)也可以被用于赋值操作的左侧:

*pi = 27; // 正确:可以将 27 赋予 pi 指向的 int
*pd = 3.14; // 正确:可以将 3.14 赋予 pd 指向的 double
*pd = *pi; // 正确:可以将一个 int (*pi) 赋予一个 double (*pd)
27.000000

重要

  • 指针类型提供一些适用于地址的操作;

  • int 提供适用于整数的(算术和逻辑)操作。

警告

不要混用指针和整数!

int i = pi; // 错误:不能将一个 int* 赋予一个 int
pi = 7; // 错误:不能将一个 int 赋予一个 int*

同样,不同类型的指针也不能混用:

char* pc = pi; // 错误:不能将一个 int* 赋予一个 chat*

char c = 'a';
char* pc = &c;
pi = pc; // 错误:不能将一个 char* 赋予一个 int*