c语言指针变量存储的是同类型其他变量的,C语言,将(指定的类型变量)的地址 随意赋值给 其他(不同类型指针变量)的可行性分析...

问题:指定的类型变量地址 随意赋值给 其他类型指针是否可行?

前期知识介绍,如下:

程序运行时的数据存储地点是RAM区域,RAM即为动态存储空间,特点是断电时数据清空,物理位置处在CPU当中。

RAM内存地址的范围解释:

若为32位(一字节8位,32位是4字节)cpu,内存地址大小范围在{ 0~[ 2^(32)-1 ] }=={ 0~4294967295 }之间,转化为16进制就是{ 00000000~ffffffff }之间。这时改CPU的RAM中最大地址范围。

64位CPU地址空间计算如上,10进制是[ 0~18446744073709551999 ],16进制为[ 0000000000000000 ~ ffffffffffffffff ]。

以下内容都按照 sizeof(int)=4说明!

问题解答:

当程序中使用 int * 指针时,其指向的地址取值范围被局限于[ 00000000~ffffffff ],也就是十进制的[0~4294967295]之间。

int *可容纳的范围非常宽,

但定义变量时用:

int a = 5;

正确操作是:

int * p = &a;

然而错误的将代码编写为:

int a = 5;

char* p = &a;

这时使用编译器进行编译的时候,如VC++6.0会报错。

其实并不是无法运行,而是VC++6.0的编译器为了减少不必要的BUG而进行的优化。

那么带着问题,让我们来分析这其中的原因,当进行

int a = 5;

有可能系统会给变量a安排的内存地址是 CPU中的RAM中的最大编号:fffffffffffffffff(以64位操作系统来说);

fffffffffffffffff 正确的赋值给 int * p 是没有问题的,但是如果将其赋值给来了

char * p ;

这时就会出现 p 的存储范围过小,无法完全存储下 ffffffffffffffff 这个地址编号,实际 char * p 的存储会对改地址进行截断处理,有原本的 ffffffffffffffff 变为 ffffffff,如果后续存在调用 char * p 中的 p 时,p 并不是指向所期望的值 a = 5 ,而是指向一个地址为 ffffffffff 的内存单元,这事一个未知的数据。

以上是举了一个 { (int 值)->char *}例子进行说明,这是一个“大地址”--到-->”小内存“时出现的问题。

那么,“小地址”--到-->“大内存”时,以上的数据丢失的问题则不会出现。

同样的也可以对float与double进行分析。注意到由于浮点的存储方式不同于整形变量,所以当对 (int 值)->( float * )分析时应考虑到这一点。

得出结论:

在将变量的存储地址赋值给指针时,为了不出现数据意外,需要求报的原则是:类型对应!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值