Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2632226
  • 博文数量: 315
  • 博客积分: 3901
  • 博客等级: 少校
  • 技术积分: 3640
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-08 15:32
个人简介

知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516

文章分类

全部博文(315)

文章存档

2019年(2)

2018年(1)

2016年(7)

2015年(32)

2014年(39)

2013年(109)

2012年(81)

2011年(44)

分类: C/C++

2011-07-27 16:17:03

                                                                       故事一

某某问题:
   

#include
#include
main()
{
     int a=6,*p;      //其实我的问题是:为什么int 可以指向void类型?
     int d;
     void *q=&a;     //这句本来有问题的,但是打印p的值竟然还是非空....
     p=q;
     d=(int)q;
     printf("%d\n",q);    
     printf("%d\n",p);//void 类型的值难道不是0 吗?就算我不把a的地址赋给他也是一个非0的负值
     printf("%d\n",&a);
     /*printf("%d\n",*q);*/ //这就会报错,强制转化后就可以了
     printf("%d\n",*(int *)(q));
     printf("%d\n",*(int *)(d));
}

高手解答:

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

阅读(1184) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~