void * 指针

22 篇文章 0 订阅
#includeusing namespace std;int main(){void *f;int i=1,*p;f=&i;cout<<"1 f is "<<f<<endl;p=(int *)f;f=p;cout<<"&i is "<<&i<<endl;cout<<"p is "<<p<<" "<<*p<<endl; /*--------重点--------*/cout<<"2 f is"<<f<<" "<<*f<<endl;//这里为什么错/* 解释如下: void * 是空类型,你不加类型进去,cout无法确定如何输出的 也就是说,printf你要自己写类型,cout是确定常用类型,但是void是任意类型,无法确定,所以不能输出, 要写成(int *)f 才可以输出。 问: f 不是指向int了吗? 答: 改变的只是他的存储方式,而不是本身的类型 问: 明白 f本身还是void,只不过现在存储int,cout还是不确定f的类型*/cout<<"2 f is "<<f<<" "<<(int *)f<<endl;cout<<*((int *)f)<<endl; return 0;}#include#includemain(){ int a=6,*p; //其实我的问题是:为什么int 可以指向void类型?//任何指针的大小都是4字节,void类型的指针,也不过是指向不定类型的一个指针。 int d; void *q=&a; //这句本来有问题的,但是打印p的值竟然还是非空....//这一句没有问题,你已经改写了void*类型指针q的值,使q这个指针是指向整型变量a。 p=q;//这里,你是将void*类型指针q的值(即a的地址)赋值给了p指针。 d=(int)q;//d变量的值是什么呢?因为你强制类型转换了,而指针其实就是4字节的变量,所以其实d的值就是q指针的值,即a变量的地址。等同于d =(int)&a; printf("%d\n",q); printf("%d\n",p);//void 类型的值难道不是0 吗?就算我不把a的地址赋给他也是一个非0的负值//void类型?请看清楚,你定义的是void类型的指针,也就是说,你定义的是一个指针,一个四字节的变量,它是可以存储数据的。 printf("%d\n",&a); /*printf("%d\n",*q);*/ //这就会报错,强制转化后就可以了//在这里当然会出现问题,因为q指向的是void类型,如果*q,那么表示的是你将printf一个void型的变量,当然不行咯,因为void类型,表示的是一个不确定的类型,所以就不会存在一个实际的对象,除非你强制转化为一个明确的类型。//下面的两句话,其实你所做的,就是给q这个void类型指针指向的地址,强制安排了一种类型,当然,其实你如果强制转化为char类型什么的,也是可以的哦。(浮点型除外,那是有独立格式的) printf("%d\n",*(int *)(q)); printf("%d\n",*(int *)(d));}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值