知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516
全部博文(315)
分类: C/C++
2011-07-27 16:17:03
#include #include #include main() { 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)); } |