C语言指针变量怎么能表示任何内存地址.

我用sizeof测试指针变量,只占了两个字节.而且我用char*p;for(p=0x0;;p++)printf("%8x",p);输出的最大值也是0xffff,说明指针变... 我用sizeof测试指针变量,只占了两个字节.而且我用
char *p;
for(p=0x0;;p++)
printf("%8x",p);
输出的最大值也是0xffff,说明指针变量只占了两个字节.两个字节只能表示2的16次方个地址,是65536个.
我的内存是256MB,有2的28次方个内存单元,指针变量至少要占四个字节才能表示所有地址啊,为什么只占两个字节.
我的内存地址是0x00000000--0x0fffffff
而指针变量能表示的地址范围是0x0000--0xffff
怎么用指针操作比0xffff大的内存地址啊.
展开
 我来答
百度网友0055132
2007-01-25 · TA获得超过659个赞
知道小有建树答主
回答量:393
采纳率:0%
帮助的人:0
展开全部
你用的是16位的编译器吧.(比如TC之类的)
你还没学汇编(或者计算机原理之类)的吧.

80X86CPU在16位模式下,地址是靠两个16位的2进制数表示的.就是 段地址 和偏移量 ,它们组合成20位的实地址能寻址1M的空间(具体怎么组合,有兴趣了自己在网上看看).

你选择的编译模式是small(TC默认的,Model Small),只有一个数据段.所以段地址固定不变(在程序运行时等于一个常数.不需要表示),所以
char *p;
sizeof(p)==2 (这是个16位的偏移量)

如果你把编译模式改成large或者huge
这个时候 char *p;
sizeof(p)就是 4 了,它包含了段地址和偏移量.

或者不管在什么模式下,你直接声明一个char far *p;
可以断定sizeof(p) 是4
这也是char near *p 和char far *p 的不同.
char far* 是包含段地址和偏移量,
char near* 则只有偏移量.

small 模式下,默认char * 就是char near*
而large模式下, 默认char * 就是 char far*
(near和far编译器帮你加上的)

段地址和偏移量组合后只有20位,所以在实模式下直接寻址只有1M空间.(注意是【直接】能寻到的空间)

如果你接触过dos(真正的dos而不是winxp下面的cmd),你就会知道,在没有扩展内存和扩充内存的情况下,总共可利用的内存只有1M(不管你的内存条是多少M的),寻址能力不行.
最后导致用户可以用的内存只有600K左右.

如果有兴趣的话,自己找点这方面的知识看看
lacunaf2a8b4
2007-01-25 · TA获得超过1252个赞
知道小有建树答主
回答量:1606
采纳率:0%
帮助的人:1161万
展开全部
依赖于编译器
用TC的话当然会这样,因为tc是16位环境编译器

当然这样写出的程序也不是不能够访问更大的内存
你可以看看dos环境下的内存管理
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友e1ee2fa91
2007-01-25 · TA获得超过233个赞
知道小有建树答主
回答量:196
采纳率:0%
帮助的人:184万
展开全部
呵呵,这个是你的编译器的问题。你在用TC么?

你还是用gcc或者vc这类编译器把。
32位平台下,一个指针就是32bit的,能够标识4Gb的空间。

hoho
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
放逐的天歌
2007-01-25 · TA获得超过468个赞
知道小有建树答主
回答量:637
采纳率:0%
帮助的人:0
展开全部
输出内存地址用%p
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友32cdd9945
2007-01-25 · TA获得超过1374个赞
知道大有可为答主
回答量:2429
采纳率:100%
帮助的人:1937万
展开全部
在 windows 平台+VC 指针是4个字节的,不知道你用的是什么东西了.

另外也不是你的内存有多大你的内存地址有多大,
windows 平台的程序都具有 2G的虚拟内存.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式