指针两个要素,彻底理解指针

本文详细解析了C/C++中的指针概念,包括指针的定义、两要素(指针值与类型)、如何通过类型决定指针的终止地址与解析方式,以及一种创新的理解方式。通过实例展示指针类型的重要性,并解释了不同类型指针在相同起始地址下如何实现差异化的数据读取。

一 背景

指针时C/C++的难点,也是重点。

看到网上有不少人说起C/C++的不足时,总是不忘说指针;实际上指针只是给了开发者操作内存的权限。


二 定义

百度百科的定义:指针是一个用来指示一个内存地址的计算机语言的变量。

首先指针时一个变量,拥有一般变量的所有特性,有生命周期,有作用域,可以赋值等;

其次,指针有它自己的特点:“用来指示一个内存地址”。


三 两要素

1 值

指针的值,一般是一个十六进制数,这个数代表内存中的一个内存的地址,一般是片内存的起始地址。

就像酒店里面的房间号一样,代表了一个房间。


2 类型

指针的类型,跟普通变量一样,指针变量也是有类型的。

一般变量的类型,决定了这个变量所占的内存大小;但是指针变量的大小固定的,32位4字节,64位8字节,为什么还需要类型呢?

且看下面的列子:

int* p = (int*)0x10000000;
double* p = (double*)0x10000000;
很明显,这两个指针的值虽然是一样的,但是他们是不同的。


那么类型究竟有什么作用呢?

答案是在取*p的值时,会用到这个类型,来决定我们读取的终止地址(指针变量的只有起始地址)。

如果是int类型,那就向前读取4个字节,读取0x10000000~0x10000032;

如果是dobule类型,那就向前读取8个字节,读取0x10000000~0x10000064;


那么是不是起始地址一样,终止地址一样两个指针就相同了呢?

当然不是,且看:

int* p = (int*)0x10000000;
float* p = (float*)0x10000000;
int和float的大小都是4个字节,读取的都是0x10000000~0x10000032这片内存,但是取出来的值*p是不同的,为什么呢?

因为解析方式不同,因为整数和浮点数在内存中存储的方式是不一样的。

看以参考我的另外两篇文章:整数在计算中的存储和运算 和 浮点数在计算中的存储

总的来说,类型决定两点:

1 终止地址,由类型所在的字节数决定;

2 解析方式,由类型的存储方式决定。


四 换一种方式理解

按照上面的解析,我们画一个示意图:


如果我们自己定义一个指针类型,大概是这样的:

enum readMethod{
	int_type;	// 整型方式解析
	float_type;	// 浮点数方式解析
};

struct pointer{
	int beginAddress;			// 指针变量的值
	struct type{				// 指针类型
		int byteCount;			// 该类型的大小
		enum readMethod method;	// 解析方式
	};
};

指针时C语言的精髓,C++也继承了这一点,不是C/C++的设计缺陷。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值