指针是什么(详解版)

执行程序中的每个变量都分配一段足够大的内存来保存该变量类型的值。当前,在 PC 上运行的 C++ 编译器通常给 char 类型的变量分配一个字节,给 short 类型的变量分配两个字节,给 float 和 long 类型的变量分配 4 个字节,给 double 类型的变量分配 8 个字节。

内存的每个字节都有一个唯一的地址。变量的地址是分配给该变量的第一个字节的地址。假设在程序中定义了以下变量:
char letter;
short number;
float amount;
图 1 说明了它们在内存中是如何安排的,并显示了它们的地址。

内存中的变量及其地址
图 1 内存中的变量及其地址

在图 1 中,变量 letter 显示在地址 1200 处,变量 number 在地址 1201 处,而变量 amount 则在地址 1203 处。

图 1 中显示的变量的地址有些随意,仅用于说明目的。事实上,大多数编译器以这样的方式分配空间,即单个变量总是被分配偶数地址。这是因为当前的计算机硬件访问驻留在偶数地址的数据时,速度要比访问驻留在奇数地址的数据更快。

C++ 有一个地址运算符 & 可以用来检索任何变量的地址。要使用它,可以将它放在想要检索地址的变量之前。以下是一个表达式,它将返回变量的地址:

&amount

以下语句可以将变量的地址显示到屏幕上:

cout << long(&amount);

默认情况下,C++ 以十六进制打印地址,以上语句则使用了一个函数式的强制转换,使地址以常见的十进制格式打印,转换后的数据类型为 long。下面的程序演示了如何使用地址运算符来显示变量的地址。
//This program uses the & operator to determine a variable's address.
#include <iostream>
using namespace std;
char letter;
short number;
float amount;
double profit;
char ch;

int main()
{
    // Print address of each variable
    // The cast to long makes addresses print in decimal
    // rather than in hexadecimal
    cout << "Address of letter is: " << long(&letter) << endl;
    cout << "Address of number is: " << long(&number) << endl;
    cout << "Address of amount is: " << long(&amount) << endl;
    cout << "Address of profit is: " << long(&profit) << endl;
    cout << "Address of ch is: " << long(&ch) << endl;
    return 0;
}
程序输出结果:

Address of letter is: 5005320
Address of number is: 5005322
Address of amount is: 5005324
Address of profit is: 5005328
Address of ch is: 5005336

值 &amount 指定了计算机内存中 amount 变量的位置:从某种意义上说,它指向的就是 amount 变量。所以,一个表示内存地址位置的值,或者保存了某些变量地址的值,就称为指针