目录
指针是内存中最小单元的编号,也就是地址。我们平时口语说的指针,其实是指针变量,一个用于保存内存地址的变量,存在指针变量中的值都会被当作地址处理。
那直接定义一种 用于保存地址的类型不就好了,为什么会有现在这样不同类型的指针?
1、意义一:决定解引用时访问多少个字节
int n = 0x11223344;
int* ptr1 = &n; // *ptr1 = ?
char* ptr2 = (char*)&n; // *ptr2 = ?
这种情况下,ptr1 和 ptr2 的地址肯定是一样的,不看类型的话,两者保存的都是 n 的地址,因为指针变量就是用来保存地址的。
下面要对 ptr1 和 ptr2 做解引用操作,
int* :解引用时每次可以访问 4 个字节,所以可以访问到全部字节
char* :解引用时每次只能访问 1 个字节,所以只能访问到第一个字节
因此,指针的类型决定了对指针引用的时候,一次能访问多少个字节
2、意义二:决定指针访问的步长
从上面我们知道指针类型的第一个意义在于解引用时可以访问多少个字节,那如果指针要向后移动一个单位,即 ptr2 + 1,此时会移动多少个字节呢??
long n = 0x11223344;
int* ptr1 = (int*)&n; // *(ptr1 + 1) = ?
char* ptr2 = (char*)&n; // *(ptr2 + 1) = ?
不移动时的解引用情况如下:
移动一个单位以后解引用时,我们将解引用的结果打印出来,发现ptr1 向后移动了 4 个字节,ptr2向后移动了 1 个字节。
因此,指针类型的第二个意义就是,决定了向前或者向后走一步的长度是多少,int类型是 4 个字节,char类型是1 个字节。
3、总结
指针类型不会改变变量在内存中的存储方式(不会因为将地址存到char* 类型的指针变量,地址指向的内容就发生截短)
指针类型改变的是看待这个变量的方式,将地址赋值给char*类型,说明要以char类型的视角来看待这个地址指向的内容。