一个指针的类型信息保存在哪里?

wusheng520 2010-04-01 08:10:10
一个指针保存的信息也就是四字节的地址信息,那它指向的类型信息保存在哪呢?
比如:
char* p1;
int* p2;
p1,p2都是一个四字节的地址吧,那编译器怎么知道p1是char*,而p2是int*呢?
...全文
543 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lxslove 2010-04-02
  • 打赏
  • 举报
回复
这个是编译器根据你写得代码识别的,你用int *它就知道该找4个字节,用char *它就知道该找1个字节,这些都是在编译时确定下来的,不是程序运行时确定的,程序运行时不知道变量类型,只是根据编译后的指令读取多少个字节来处理而已。
Julykey 2010-04-02
  • 打赏
  • 举报
回复
学习了
嘎文 2010-04-01
  • 打赏
  • 举报
回复
我前几天也突然想起这个问题了,后来我给自己找到答案和3楼的类似。就是说,所谓的类型只在源文件有所体现,我想这也是“高级语言”这一称谓所包含的意思之一吧。通过编译器的解释,源文件最后生成二进制的可执行文件,在这一二进制文件中,就没有所谓的类型一说了,说白了,全是0和1驱动着电路开关。
niejimaoo 2010-04-01
  • 打赏
  • 举报
回复
还没看编译原理呢,听说很难
CSDMAdmimistrator 2010-04-01
  • 打赏
  • 举报
回复
类型信息?
RTTI?
对于静态类型(没有虚函数的类)的类型信息是在编译时确定的
jbz001 2010-04-01
  • 打赏
  • 举报
回复
这是规定!!!
ShineShineRedStar 2010-04-01
  • 打赏
  • 举报
回复
指针也是一种数据类型,指向不同类型的指针它们的数据类型也是不一样的,尽管它们的长度是一致。这跟int,float,long虽然都是四个字节,但代表不同的数据相类似。如何保存这些类型的信息那要靠编译器的实现了,lz可以去看看编译原理。
DontKissBossAss 2010-04-01
  • 打赏
  • 举报
回复
	int a=20;
//004113BE mov dword ptr [a],14h
int *p = &a;
//004113C5 lea eax,[a]
//004113C8 mov dword ptr [p],eax

被注释掉的是混编代码,现在总有解释了
1:有类型检查,不是亲戚不叫转换,想办法转换的话,那是挑刺了。
2:p指向 004113BE,Dword(32位)长度的内存。
机智的呆呆 2010-04-01
  • 打赏
  • 举报
回复
可以认为是体现在编译器生成的汇编指令中了,
char* p1;
int* p2;
两个指针变量赋值时,生成汇编指令没有什么差异,
而对这两个变量进行解引用时,两者就有差异了
*p1:只是生成对p1值对应内存里的数据操作的汇编指令,访问方式按照char数据访问方式
*p2:生成对p2~(int)p2+3内存里数据操作的汇编指令,访问方式按照int数据访问方式
以上体现了指针变量的类型信息,但不是很准确的,因为许多变量所占空间和访问方式生成的汇编指令是几乎一致的。

所以对应c/c++编译器大部分情况下,只是简单的根据变量类型信息生成对这种变量操作的汇编指令,类型信息在生成汇编指令后已完成他大部分的使命了,在大部分情况下,c/c++生成的二进制文件中,变量名,变量类型等这些元数据几乎没有~~~~此时也没必要存储类型信息了
DontKissBossAss 2010-04-01
  • 打赏
  • 举报
回复
忘记了,看下混编应该就知道了吧,我看看去
wusheng520 2010-04-01
  • 打赏
  • 举报
回复 1
我是觉得指针的类型信息总得以某种形式存在吧,不然通过指针寻址的时候为什么char*的就只解释从起始开始地址的一个字节,而int* 则解释从起始地址开始以后的四个字节呢?
zhaohad 2010-04-01
  • 打赏
  • 举报
回复
一下只是个人理解:
c代码或者更高级的语言代码都要转换成为目标代码,最后都是0和1的位,编译器在编译原文件的时候确定所声明变量的类型,但是在编译成bin文件的时候直接将有变量类型有关的操作进行解释,所以内存中应该不需要存储变量的类型,这些类型而是由编译器所控制和便转换的。关于高级的语言向下屏蔽的底层的一些实现细节
DontKissBossAss 2010-04-01
  • 打赏
  • 举报
回复
UP 个,没学编译原理呢,围观。
BT六眼飞鱼 2010-04-01
  • 打赏
  • 举报
回复
因为你告诉编译器啦。。。你写的嘛
char* p1;
int* p2;
。。。。

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧