对应的视屏链接:鲍松山的个人空间_哔哩哔哩_bilibili
目录
1、指针的大小为什么是4字节或8字节
原理:
首先我们先做一个类比,给你 1 位十进制数,你能够编号 10 个数(0~9),如果给你2 位十进制数,则能够编号 100 个数(0~99)……
对于计算机来说,底层所处理的数据都是二进制,一样的方式,给你 1 位二进制,只能编号 2 个数(0,1),给你 2 位二进制,则能编号4 个数(00,01,10,11),
可以试想,如果给你 n 位二进制,是不是就能编号 2^n 的状态。那么,现在,系统是 32 位的,则我们能够编号的范围是 0~2^32,即为 4G 的大小,这样一来,系统为了保证能够访问到任何一个地址,则我们的指针变量所占空间大小最起码需要能够包含所有的地址表示,反过来,要想表示 4G 空间的大小,至少的 4 个字节
因此,指针的大小在 32 位系统下一定是 4 个字节
总结一句话:大了浪费,小了不够
2、既然指针大小是相同的,为啥还要区分不同类型的指针
1、首先这里所说的不同类型,指的是指向的类型
对指针而言,指向的类型是很重要的一个指标
2、决定了指针所能操作的内存范围
#include<stdio.h>
int main()
{
int a = 0x11223344;
char *pc = (char*)&a;
short *ps = (short*)&a;
int *pi = &a;
printf("0x%x\n", *pc);
printf("0x%x\n", *ps);
printf("0x%x\n", *pi);
return 0;
}
运行结果:
0x44
0x3344
0x11223344
思考:为什么指针所指类型会决定指针所能操作的内存范围,需要从存储角度来理解
3、决定了指针+1的能力(即指针+1,到底加几个字节)
#include<stdio.h>
int main()
{
int a = 0x11223344;
char *pc = (char*)&a;
short *ps = (short*)&a;
int *pi = &a;
printf("0x%p : 0x%p\n", pc, pc+1);
printf("0x%p : 0x%p\n", ps, ps+1);
printf("0x%p : 0x%p\n", pi, pi+1);
return 0;
}
运行结果:
0x00BDF9DC : 0x00BDF9DD 加了1个字节
0x00BDF9DC : 0x00BDF9DE 加了2个字节
0x00BDF9DC : 0x00BDF9E0 加了4个字节
4、指针+1的应用
下面程序结果是多少?
struct BBB
{
long lA1;
char cA2;
char cA3;
long lA4;
long lA5;
}*p;
p = (struct BBB*)0x100000;
p + 0x1 = 0x__________
(unsigned long)p + 0x1 = 0x____________
(unsigned long*)p + 0x1 = 0x_____________
(char *)p + 0x1 = 0x_______________