C语言不同类型的指针不能相互赋值

目录

写在前面的

不同类型的指针的相同点

指针类型的意义

一、指针类型决定了指针变量访问空间的能力

二、指针的类型决定了指针操作的步长

综上: 不同类型的指针不能够相互赋值 

最后        


写在前面的

计算机的储存机制如下图,在一台计算机中,其内容字节大小一致,不同类型的数据所占字节大小不同

不同类型的指针的相同点

所有类型的指针的字节数是相同的(如下图),本人由于这一点产生了关于本题目的疑问

 那就来说说不同类型的指针不能相互赋值的原因

既然指针有类型之分,那么指针类型的意义有什么意义

指针类型的意义

一、指针类型决定了指针变量访问空间的能力

也可以叫指针解引用的能力,也就是说解引用的时候能操作几个字节。

上图可见,不同数据类型所占字节不同,指针指向数据地址,也就说说指向着这种类型的数据,在进行解算,操作这个数据时就按照这种数据类型的进行。

举个2个例子

1.现在有一个float类型的指针(这个指针是由char类型强制转换来的),但是它指向的有效数据只有1个字节,这样就会得到一个错误的数据。

2.现在有一个char类型的指针(这个指针是由float类型强制转换来的),程序运行输出的数据不对,原因便是操作这个数据时只对一个字节进行操作,而正确的数据是四个字节,例如数据本身应该是0x11398482,可是却是0x82,丢失了高位数据。

二、指针的类型决定了指针操作的步长

步长:指针变量加或减一个整数,指针向后或向前移动的字节数

这里先提一下指针操作有哪些,见图

         这一个意义主要是指针的加减操作中进行体现,拿数组举个例子,在进行数组遍历时,移动一次恰好是数据类型的整数倍,也就是说整型每次移动的字节数是4字节的整数倍,而不是1字节,2字节之类的。而如果,你把一个数组的首元素地址赋值给一个不同类型的指针(我想,在你编译时,应该就会有警告吧),会超出数组的范围,造成内存泄漏或者破坏其他数据

        这里拿数组举例子的原因是数组定义就包括指针定义,指针的所有操作都可以在数组中应用:

        数组是一些相同数据类型的变量组成的集合,其数组名即为指向该数据类型的指针。数组的定义等效于申请内存、定义指针和初始化

综上: 不同类型的指针不能够相互赋值

原因如下:

1、不同类型的指针赋值会导致数据类型不匹配或者数据截断。

例如

        如果把一个char型指针赋值给一个int型指针,那么当对int型指针解引用时,会读取4个字节的数据,而char型指针只占用1个字节,这样就会读取到错误的数据。

        如果把一个long型指针赋值给一个short型指针,那么当对short型指针解引用时,只会读取2个字节的数据,而long型指针占用4个字节,这样就会丢失高位的数据。

2、不同类型的指针赋值会导致内存访问越界。

例如

        如果把一个数组的首元素地址赋值给一个不同类型的指针,那么当对该指针进行加减运算时,会按照不同的步长移动,可能会超出数组的范围,造成内存泄漏或者破坏其他数据。

3、除此之外,指针指向的对象结构不同,它们的访问方式和操作方法有所不同

        指向数组的指针和指向结构体的指针,它们的访问方式和操作方法有所不同。指向数组的指针可以通过下标运算符[]来访问数组元素,也可以通过加减整数来移动指针位置。指向结构体的指针可以通过箭头运算符->来访问结构体成员,也可以通过强制类型转换来访问不同类型的成员。
        指向函数的指针和指向变量的指针,它们的调用方式和传递方式有所不同。指向函数的指针可以通过解引用运算符或者直接使用函数名来调用函数,也可以作为参数传递给其他函数。指向变量的指针可以通过解引用运算符或者取地址运算符&来访问或修改变量的值,也可以作为返回值返回给调用者。
        void型指针和具体类型的指针,它们的通用性和限制性可能有所不同。void型指针可以接受任何类型的地址,但是不能对void型指针进行解引用或者加减运算。具体类型的指针只能接受相同或者兼容类型的地址,但是可以对具体类型的指针进行解引用或者加减运算。

最后        

        直接将一个类型的指针赋值给另一个类型的指针是不安全和不可靠的。为了保证程序的安全性和正确性,不建议直接赋值不同类型的指针。

        若有特殊需求,可使用强制类型转换,在进行类型转换时,应该使用适当的类型转换操作来保证数据类型的一致性和正确性,注意检查转换后的结果是否符合预期

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值