认识C指针的类型。

本文通过一个简单的C语言示例解释了指针类型的重要性。当尝试使用整型指针访问字符变量时,由于类型不匹配导致的数据读取错误,强调了正确使用指针类型对于数据访问的准确性至关重要。

遇到一个好玩的错误,大家一起来看看

 

#include <stdio.h>

int main()

{

  int a=10;

     char b=1;

  int *p;

  p=b;

  printf("b的值是:%d",*p);

  return 0;

}

  本意是想通过指针p去间访字符b,以ASCII码的方式打印出来,而字符b在内存中的只是1.所以预期打印出来的应该是 1.

而结果却是给出了一个警告,

warning: incompatible integer to pointer conversion assigning to
      'int *' from 'char' [-Wint-conversion]
    p=b;
     ^~

  仔细一看才知道指针P的类型写成了  int。改成char后正常。

  笔者也是初学,一番研究之后才搞明白。按道理说,无论你把指针定义成什么类型的,它在内存中总是占着8个字节。那么,指针的类型存在的意义是什么呢?

简单来说,指针类型的作用体现在访问和赋值的时候,而且很重要。当我们在定义 int a=10;的时候,系统会为a分配相应的内存空间去存放a,int型为四个字节,在内存中也就是

00000000 00000000 00000000 10100000,

然后定义字符b=1,系统会在a的后面继续的存储b,而b是char类型的,占1个字节。也就是00000001,那么着连续的5字节中存着两个值,

00000000 00000000 00000000 10100000 00000001。

而指针p中存得时b的地址值,当我们通过*p去访问b时实际上就是从p中存得地址值开始去一一取值,那么取到什么地方停止呢?这个时候既要看指针的类型了,代码中p的类型是int,大家知道int占4个字节,那么通过*p去取值就会相应的取4个字节,也就是

00000000 00000000 10100000 00000001,

这当然已经不是b原来的值了。新版本的编译器不允许类型的混乱。老版本的编译器给出警告但是依旧会运行成功,打印出00000000 00000000 10100000 00000001对应的10进制数。当然是错误的。

  同样的,当我们用指针去访问一个类型与指针类型不一样的变量并给它赋值的时候,也会出现相似的错误。看起来很小的一个知识点,实际上却是很重要的。

 

转载于:https://www.cnblogs.com/LLseek/p/4138512.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值