指针变量要求类型与指向数据类型一致

指针变量要求类型与指向数据类型一致,如果指针类型与指向数据类型不一致,在用指针实现一些运算时会出问题,一些情况如下:

代码如下:

#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;

所以在用指针时一定要注意指针变量要求类型与指向数据类型一致

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值