#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);
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
定义一个指向整数的指针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的地址这样的东西.
非常感谢大家的解答在此一并谢过!