【C语言-不同类型的指针在数组中的作用】

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个字节。

猜你喜欢

转载自blog.csdn.net/ggbb_4/article/details/129326918