1.不同类型的指针占用的空间一样:
指针有多种类型,在求取不同类型指针所占用的空间大小时,发现都是占用4个字节。
char* p1;
int* p2;
short* p3;
float* p4;
printf("%d\n",sizeof(p1));//4
printf("%d\n", sizeof(p2));//4
printf("%d\n", sizeof(p3));//4
printf("%d\n", sizeof(p4));//4
2.指针的类型决定解引用的范围:
首先定义一个变量:int a = 0x11223344;(补充:4位二进制表示一个十六进制位,0x11223344共有32位2进制组成,可以看成是4个字节,且int类型定义出来的变量就是4个字节)
int a = 0x11223344;
它在内存中的存储情况如下:
数据的低位字节存储在内存的低位地址中
数据的高位字节存储在内存的高位地址中(小端模式)
【char型指针】然后定义一个char型的指针变量,指向变量a;并对指针的解引用重新赋值
char* pa1 = &a;
*pa1 = 0x88;
结果输出:
也就是说,使用char类型指针对变量a重新赋值,只改变了第一个字节,其余字节不变,也就是说,char型指针解引用了一个字节。
【int 型指针】定义int型指针变量,同样指向a,并重新赋值。
int * pa2 = &a;
*pa2 = 0x55667788;
此时,4个字节全部发生变换,也就是说利用int型的指针可以解引用4个字节。
3.指针的类型决定了指针的步长:
【char型指针】
int c[10] = { 0 };
char* p = c;
int i = 0;
for (i = 0;i<10;i++)
{
*(p + i) = 1;
}
结果:上图可以看到内存开辟了40个字节
可以看出:char型指针是连续指向每个字节,先指向第一个字节,然后赋值,再指向下一个字节,然后赋值........。
【int 型指针】定义int型指针变量,for循环对数组内的元素重新赋值
int c[10] = { 0 };
int* p = c;
int i = 0;
for (i = 0;i<10;i++)
{
*(p + i) = 1;
}
结果:可以看到内存开辟了40个字节
赋值结果:
可以看出,指针指向第一个字节,并对当前地址开始的连续4个字节赋值,然后指针指向第5个字节,对下一个连续的4个字节赋值。(不是说只改变了如下红色的 01 ,其实赋值过程是将
01 00 00 00存放到内存中去)
为了更加清楚的显示:
我将c[]数组初始化为如下,并在循环中将数组元素赋值为5
int c[10] = { 0x11111111,0x22222222,0x33333333,0x44444444 };
int* p = c;
int i = 0;
for (i = 0;i<10;i++)
{
*(p + i) = 5;
}
结果:前4个字节分别赋值为 0x11111111,0x22222222,0x33333333,0x44444444,后面默认是0;
然后进入第一次for循环赋值:
也就是int型指针指向的是第一个地址,但是解引用的范围是连续的4个字节。