开发者社区 问答 正文

void * 指针问题请教?报错

#include <stdio.h>

void main()
{
    int *a = ((void *)2);
    int b = 2222;
    int *c = &b; 
    printf("The result is %d\n", a); 
    printf("The result is %d\n", sizeof(a));
    printf("The result is %d\n", sizeof(b));
    printf("The result is %d\n", sizeof(c));
    printf("The result is %p\n", c); 

}

代码如上面,一直搞不清楚下面这个怎么理解

int *a = ((void *)2);
可以确定a是一个指针,可是它指向什么呢?地址是2的空间?还是2的地址?

如果这是一个指针,为什么下面这句可以直接打印a却不报错呢?就想打印一个整数一样

printf("The result is %d\n", a);




展开
收起
爱吃鱼的程序员 2020-06-10 13:48:57 711 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    定义一个指向整数的指针a,指针的值等于2,由于2是一个常量,默认的类型可能无法正确转换成a所对应的整数指针类型,所以前面加一个强制的类型转换把2转换成无类型指针(void*),指针的内容是一个整数值,这个值的位数与机器相关,但对于具体的机器这个值是固定的,编译器是知道目标平台的体系结构和操作系统类型,比如你现在用x86的机器跑32位linux,这时地址值是4字节,每个指针内容都是一个4字节整数,这个整数对应一个内存地址,(void*)等于告诉编译器你需要把2转换成一个4字节的整数0x00000002,(int*)定义的a的内容也是一个4字节整数,所以可以把前者赋值给后者,(void*)与(int*)的区别只是(int*)除了告诉编译器这是一个地址之外,还说明了a保存的这个地址的内容是整数,那么当其他地方用到a时就可以按整数处理。地址是一个整数值,所以可以当做整数print出来。
    上面那句就是让让a指向地址为2的空间。你后面打印的只是a这个变量里的值(就是2)。在32位机上地址的大小也是一个int,所以%d==%p。如果你那句写的是printf("Theresultis%d\n",a);应该就会收到一个segmentfault异常而崩溃。人为指定指针的指向,intp=((void*)2);是指p本身是个指针,其值为0x2;所以printf("theresultis%d\n",a);就是将p的值打印出来,只不过%d会转为%p,是个整型

    指针就是整数.对整数的不同解释就变成的"不同类形的指针".

    "可以确定a是一个指针,可是它指向什么呢?地址是2的空间?还是2的地址?"

    像代码里直接写的2,3,4这样的数字,是没有一个单独的内存的,只是机器码里的一部分.所以没有2的地址这样的东西.

    非常感谢大家的解答在此一并谢过!

    2020-06-10 13:49:12
    赞同 展开评论
问答分类:
C++
问答标签:
问答地址: