指针大小都是4/8个字节,为什么要区分类型呢?(初识指针)【学习笔记】

一、指针是什么?

在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

二、指针和指针类型

#include <stdio.h>
int main()
{
	printf("%d\n", sizeof(char*));
	printf("%d\n", sizeof(short*));
	printf("%d\n", sizeof(int*));
	printf("%d\n", sizeof(double*));
	return 0;
}

当我们输入上述代码时,运行会得到下列的结果

 或

 这是因为电脑地址线不同导致的,32位得到的为4,64位得到的为8,但是四种类型的指针大小都是相同的,既然都是相同的,为什么要区分不同的指针类型呢?

#include <stdio.h>
int main()
{
	int a = 0x11223344;//0x表示16进制,一个十六进制位代表4个二进制位,11、22、33、44可以占四字节
	int* pa = &a;
	char* pc = &a;
	printf("%p\n", pa);
	printf("%p\n", pc);
	return 0;
}

输入上述代码虽会出现不兼容,但仍很好的将地址存储起来,得到相同的地址 ,既然地址可以存在不同的变量中,那指针的类型岂不是更没意义。

 三、指针类型带来的区别

#include <stdio.h>
int main()
{
	int a = 0x11223344;
	int* pa = &a;
	*pa = 0;
	return 0;
}

 我们将a的值进行更改,启动调试中的内存,输入&a通过a的地址我们可以看到内存

 先不要管顺序,倒着我们可以看到放入的11223344,继续向下走,可以看到内存的改变

由44 33 22 11变为00 00 00 00 ,接下来我们换一种指针类型

#include <stdio.h>
int main()
{
	int a = 0x11223344;
	char* pc = &a;
	*pc = 0;
	return 0;
}

 同样上述的操作,得到内存字节的改变。

 我们可以看到仅有一个字节发生了改变。

指针类型有什么意义呢?指针类型存储数据时什么样的类型都可以存放,但是进行解引用操作时,就产生了差异,指针类型决定了指针进行解引用操作时能够访问的空间大小(能操作几个字节)。

读者可以自行尝试,int*可以访问4个字节,char*可以访问1个字节,double*可以访问8个字节,也就是int*指针认为它指向了一个int,只能访问四个字节,其余相同。

那么指针类型还有别的意义吗?

#include <stdio.h>
int main()
{
	int a = 0x11223344;
	int* pa = &a;
	char* pc = &a;
	printf("%p\n", pa);
	printf("%p\n", pa+1);

	printf("%p\n", pc);
	printf("%p\n", pc+1);
	return 0;
}

 不难发现,第一行和第三行仍然相同,但是实行+1之后第二行相较于第一行+4,也就是跳过了四个字节,一个整型,而第四行相较于第三行+1,跳过一个字节,一个字符。指针类型还决定了指针一步走多远(指针的步长)。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值