本期介绍
主要介绍:指针类型是如何定义的,与一般类型的定义方式有什么区别,为何要如此区别开来,这样做会带来什么样的好处,指针解引用和指针偏移操作的深层理解。
文章目录
- 前言
- 指针的类型
- 指针的解引用
- 指针的偏移量
- 总结
前言
不知道大家有没有想过一个问题:其他像整形、浮点型、字符型在C语言中都有独属于自己的类型定义,但为什么指针就没有单独属于它自身的一种类型呢(即:指针类型)?反而要在其他类型的基础上后面加个‘ * ’来表示是指针类型?存在即合理,不然你想啊人家为什么这么来定义呢,人家又不傻你想到的他肯定也想到了。这就要好好说说指针类型如此定义的好处了,而这两个好处与指针类型的两个重要的性质有关:
1.指针的类型决定了指针在解引用操作的时候能够访问空间的大小;
2.指针的类型决定了指针加减整数时一步能够走多远,即一次能跳过几个字节;
指针的类型
我们知道指针的类型是由其指向变量的类型来决定的。就譬如指向的是一个int型,那指针的类型就是int*型;指向的是一个char型,那指针的类型就是char*型;指向的是一个float型,那指针的类型就是float*型。可见指针的类型其实并不统一,杂七杂八的非常乱。但值得注意:在同一个平台上,不管是何种类型的指针变量其所占内存空间都是一样的。如下图所示:
但这是为什么呢?我们知道指针变量就是用来存放地址的,而只要是地址那就是一串长度固定不变的二进制序列,是不会根据其指向的类型的变化而变化的。 可以这么说:指针所占内存空间的大小与指针的类型毫不相干,只与指针所在的平台有关。就譬如在32位的平台上,地址是用32个的二进制序列来表示的,那指针变量所占内存空间就固定为4个字节(32个二进制位)。而在64位平台上指针变量所占内存空间就固定为8个字节(64个二进制位)。
指针的解引用
相信大家在学习指针的时候会有这么一个想法:既然指针变量存储都是地址,而地址的大小也都是一样的,那能否将不同类型的地址放到不同类型的指针里面去呢?答案当然是可以的,但当你对该指针进行解引用操作的时候,你就会发现出问题了。
例1(指针类型不同且解引用访问字节个数不同)
就如下图所示,当用int型指针存放int型变量的地址时,对指针进行解引用操作然后再赋值是可以将4个字节空间赋值为0;(注意这里的11223344是十六进制数)
但如果用char型指针接受int型变量的地址然后再对其解引用赋值为0操作后,你会发现这时所能改变的只有1个字节了。如下图所示:
例2(指针类型不同但解引用访问字节个数相同)
如上图所示,int类型指针解引用向变量a赋值100后,内存空间里面存放的是16进制的64,即10进制的100;
如上图所示,float类型指针解引用向变量a赋值100后,内存空间里面存放的并不是100啊。这是为什么呢?是因为float类型的指针会以为其所指向的那块内存空间是用来存放浮点数的,当向那块空间内存放100的时候,将会按照浮点数的存储空间的方式往里面存,所以内存里存放的形式必然会与整形的存放方式不同 (整数和浮点数在内存中的存储方式是有所差异的)。所以就算int型指针和float型指针解引用访问字节个数相同,也是不能混为一谈的,因为不同类型的指针看待内存的视角是截然不同的。
你有没有想过一个问题:由于不同类型的变量所占用的内存空间的不一样的,指针变量在解引用访问时是如何来确定要访问空间的大小呢?通过上面的例题答案不言而喻: 通过在其他类型的基础上后面加个‘ * ’来定义指针类型的这种方式来判断在解引用访问时需要访问多大的空间。所以我想这就是为什么指针要如此定义的原因了,当然这只是其中的一个原因。
指针的偏移量
相信大家在接触指针最开始的时候会误以为指针加减一个整数就是,地址加减同样长度的字节个数。但事实真是如此吗?下面有个例子仔细看一下:
你会发现int型指针+1后跳过4个字节,而char型指针+1后跳过1个字节。这是不是与之前我们所想就有所出入了吧,所以现在我们应该知道: 不同类型的指针在 +1 或 -1 的时候所跳过的字节个数是不一样的,是由指针的类型决定的。那这个性质有什么用处呢?你想啊,我们所创建的数组在内存中其实是一个连续的存储空间,而且数组中每个元素的类型都是一样的。若我访问完其中的一个元素然后想要访问下一个,是不是就只需要指针+1操作就好了,因为我会通过指针的类型知道要跳多少个字节才能访问到下一个元素。这样是不是很方便?所以我想这也是为什么指针要如此定义的原因之一。
总结
如上面所说, 这样定义指针使得其具有一定类型的根本目的是为了在对指针进行解引用、偏移操作的时候,指针都会有自己这样一个步调、这样一个权限,这样指针对于内存的访问就更加的方便而且灵活了。为什么说会灵活呢?我想指针类型如此设计的另一个目的了。举个例子,若我想对一个整形变量在内存中的某一个字节进行修改该怎么办呢?去算吗?当然不是,这就要结合使用前面所说的两个性质了,是不是只需要通过char型指针的视角来访问这个整形变量就可以做到修改内存中某一个字节。 而内存不过是一块大的空间,你期望用什么样的视角来访问内存,你就用什么样合适的指针类型去访问,如果类型不匹配大不了强制类型转换嘛,所以说指针是非常非常的灵活多变。
这份博客如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位点赞评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧。



