变量的内存地址叫指针,存放指针的变量叫指针变量。估计不少人会混淆这2个概念,而且有的书籍资料把“指针变量”称为“指针”。
1、数据的存储方式
程序中的数据都会占用一块内存空间,不同数据类型占用的内存大小不同。比如char、bool是1个字节、short是2个字节、int是4个字节等。
内存是有地址的,计算机是通过内存地址来访问的。在计算机中,1个地址代表1个字节。我们常说的8位、16位、32位、64位,指的是地址的长度。即地址有几个bit位。
比如:
(1)8位机表示地址长度是8个bit,2进制的11111111转成16进制是FF,所以地址范围是0x00 -- 0xFF。这样就有256个地址,即内存的大小是256个字节。
(2)32位机表示地址长度是32个bit,所以地址范围是0x0000 0000 - 0XFFFF FFFF。有2^32个地址,即内存的大小是4G。
假设现在定义了2个变量:int i, int j,因为每个变量占4个字节内存,则这2个变量在内存中的位置大概是像下面这样的。
2、数据的读取方式
知道了变量的地址和变量的类型后,就可以这样访问变量int i了:
(1)先找到存放变量的首地址,比如0x0000 0001;
(2)从这个地址开始取4个字节的数据。
我们可以用代码来演示一下:
class A {
public:
int i = 11;
};
int main()
{
A a;
int* i = (int*)&a;
printf(" 变量i的值: %d\n", *i);
return 0;
}
我们先用&a取到了对象a的首地址,根据C++对象模型我们知道这个首地址也是变量i的首地址,所以从这个地址开始取int类型长度的数据就是变量i的值。
通过地址我们能找到所需的变量,也可以说地址“指向”该变量。因此,这个地址也被称为指针,即英文pointer。所以我们在C++中所说的指针其实是一个地址。
指针也需要有地方存储,这个存储指针的变量就叫指针变量,即存储指针的变量。