遇到一个好玩的错误,大家一起来看看
#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进制数。当然是错误的。
同样的,当我们用指针去访问一个类型与指针类型不一样的变量并给它赋值的时候,也会出现相似的错误。看起来很小的一个知识点,实际上却是很重要的。