一 背景
指针时C/C++的难点,也是重点。
看到网上有不少人说起C/C++的不足时,总是不忘说指针;实际上指针只是给了开发者操作内存的权限。
二 定义
百度百科的定义:指针是一个用来指示一个内存地址的计算机语言的变量。
首先指针时一个变量,拥有一般变量的所有特性,有生命周期,有作用域,可以赋值等;
其次,指针有它自己的特点:“用来指示一个内存地址”。
三 两要素
1 值
指针的值,一般是一个十六进制数,这个数代表内存中的一个内存的地址,一般是片内存的起始地址。
就像酒店里面的房间号一样,代表了一个房间。
2 类型
指针的类型,跟普通变量一样,指针变量也是有类型的。
一般变量的类型,决定了这个变量所占的内存大小;但是指针变量的大小固定的,32位4字节,64位8字节,为什么还需要类型呢?
且看下面的列子:
int* p = (int*)0x10000000;
double* p = (double*)0x10000000;
很明显,这两个指针的值虽然是一样的,但是他们是不同的。
那么类型究竟有什么作用呢?
答案是在取*p的值时,会用到这个类型,来决定我们读取的终止地址(指针变量的只有起始地址)。
如果是int类型,那就向前读取4个字节,读取0x10000000~0x10000032;
如果是dobule类型,那就向前读取8个字节,读取0x10000000~0x10000064;
那么是不是起始地址一样,终止地址一样两个指针就相同了呢?
当然不是,且看:
int* p = (int*)0x10000000;
float* p = (float*)0x10000000;
int和float的大小都是4个字节,读取的都是0x10000000~0x10000032这片内存,但是取出来的值*p是不同的,为什么呢?
因为解析方式不同,因为整数和浮点数在内存中存储的方式是不一样的。
看以参考我的另外两篇文章:整数在计算中的存储和运算 和 浮点数在计算中的存储
总的来说,类型决定两点:
1 终止地址,由类型所在的字节数决定;
2 解析方式,由类型的存储方式决定。
四 换一种方式理解
按照上面的解析,我们画一个示意图:
如果我们自己定义一个指针类型,大概是这样的:
enum readMethod{
int_type; // 整型方式解析
float_type; // 浮点数方式解析
};
struct pointer{
int beginAddress; // 指针变量的值
struct type{ // 指针类型
int byteCount; // 该类型的大小
enum readMethod method; // 解析方式
};
};
指针时C语言的精髓,C++也继承了这一点,不是C/C++的设计缺陷。