指针变量要求类型与指向数据类型一致,如果指针类型与指向数据类型不一致,在用指针实现一些运算时会出问题,一些情况如下:
代码如下:
#include<stdio.h>
//指针变量要求类型与指向数据类型一致
int main()
{
int a=0x1234;
int *p;
char *c;
p=&a;
c=&a;
printf("p=%p\n",p);//等价于printf ("p=%p\n",&a)
printf("c=%p\n",c);//等价于printf("c=%p\n",&a)
printf("a=%x\n",*p);
printf("a=%x\n",*c);//取值的时候出了问题,取值运算符会根据指针的类型访问不同大小的空间
printf("++p=%p\n",++p);//做自增的时候出了问题,指针类型不同导致自增后的地址空间也不一致
printf("++c=%p\n",++c);
}
运行结果:
如运行结果所示,可以发现,不管是那种类型的指针,当它指向同一个变量时,在上图中指针p、c是指向的a的,当输出它存放的地址时都是一样的,
但在利用p、c指针取a中存放的数值时出了问题,用p指针可以取出取出a完整的值,用c指针取出的值就不完整,因为printf(“a=%x\n”,*p);
printf(“a=%x\n”,*c);在取值的时候出了问题,取值运算符会根据指针的类型访问不同大小的空间,而p指针和a一样同为int型,能取4个字节的内容;而c指针为char型,只能取1个字节的内容,所以用c取出的值是残缺的
同时在做指针的自增和自减时也出了问题,printf(“++p=%p\n”,++p);
printf(“++c=%p\n”,++c); 如运行结果所示,p、c指针指向的是a的地址,地址为FE0C,当指针p和c各自自增1的时候,p指向的地址为FE10,而c指向的为FE0D,这是因为做自增的时候出了问题,指针类型不同导致自增后的地址空间也不一致,p指针为int型,当p+1的时候,在地址上表现出来的就是地址向后偏移了4个字节,由16进制的加法可知FE0C+4=FE10;而c指针为char型,当c+1的时候,在地址上表现出来的就是地址向后偏移了1个字节,由16进制的加法可知FE0C+1=FE0D;
所以在用指针时一定要注意指针变量要求类型与指向数据类型一致