鱼C论坛

 找回密码
 立即注册
查看: 2252|回复: 12

[已解决]为什么32位操作系统的char指针是4个字节的?

[复制链接]
发表于 2020-8-6 14:02:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如题,为什么32位操作系统的char指针是4个字节的?跟32位cpu的数据总线有关吗?一次可以处理32位的数据,所以是32bit/8 = 4Byte吗?
假如 64位的操作系统 ,但是用的是32位的cpu,一个char指针还是4个字节吗?这个是要看编译器的吗?
最佳答案
2020-8-6 14:19:46
大妈学编程 发表于 2020-8-6 14:19
32位操作系统 ,使用32位来存储内存地址,所以32bit/8 = 4byte,是这样来的吗?

是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-6 14:02:52 | 显示全部楼层
32位和64位系统中,编译器为了相互兼容,所以指针都是4个字节长度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 14:03:07 | 显示全部楼层
指针存储的是地址,占 4 个字节没毛病
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 14:03:33 | 显示全部楼层
本帖最后由 baige 于 2020-8-6 14:07 编辑

32位编译器指针都是4个字节,64位编译器指针8个字节
dev的话可以在这里更换32位,64位测试

批注 2020-08-06 140528.png
  1. #include <stdio.h>

  2. int main()
  3. {
  4.         char *p;
  5.         printf("%d",sizeof(p));
  6.         return 0;
  7. }
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 14:10:45 | 显示全部楼层
这是64位编译器的运行结果
批注 2020-08-06 140956.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 14:12:16 | 显示全部楼层
这是32位编译器
批注 2020-08-06 141141.png

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-8-6 14:14:41 | 显示全部楼层
xiaosi4081 发表于 2020-8-6 14:02
32位和64位系统中,编译器为了相互兼容,所以指针都是4个字节长度。

这个我之前百度了一波,好像是编译器的问题,64位系统 ,用64位的编译器可以得到8位的指针。但是不明白32位系统 ,指针大小4字节背后的原理。请大佬不吝赐教。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-6 14:19:09 | 显示全部楼层
zltzlt 发表于 2020-8-6 14:03
指针存储的是地址,占 4 个字节没毛病

32位操作系统 ,使用32位来存储内存地址,所以32bit/8 = 4byte,是这样来的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 14:19:46 | 显示全部楼层    本楼为最佳答案   
大妈学编程 发表于 2020-8-6 14:19
32位操作系统 ,使用32位来存储内存地址,所以32bit/8 = 4byte,是这样来的吗?

是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 14:20:50 | 显示全部楼层
百度的:编译器一般默认32位的,32位寻址也就是32位二进制,转换成16进制就是8位,一个字节是两位16进制代码,8位就是4个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 14:24:46 | 显示全部楼层
本帖最后由 jackz007 于 2020-8-6 14:28 编辑
大妈学编程 发表于 2020-8-6 14:14
这个我之前百度了一波,好像是编译器的问题,64位系统 ,用64位的编译器可以得到8位的指针。但是不明白32 ...


    32 位程序内存采用 32 位指针进行寻址,所以,不止是一个 char 型的指针,任何类型的指针都必须占用 4 个字节;如果是 64 位程序,内存采用 64 位指针进行寻址,所有的指针都必须占用 8 个字节。道理很简单,想一想,你的车牌是不是一定是 7 个字符(拒绝杠精)?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 14:56:52 | 显示全部楼层
本帖最后由 风过无痕1989 于 2020-8-6 14:59 编辑

       cpu是无法直接在硬盘上读取数据的,而是通过内存读取。cpu通过地址总线、数据总线、控制总线三条线对内存中的数据进行传输和操作。

  具体流程:

  1、cpu通过地址总线,找到该条数据;

  2、通过控制总线得知该操作是读操作还是写操作;

  3、通过数据总线将该数据读取到cpu或者从cpu写到内存中。

  所以,

  地址总线的宽度决定了CPU的寻址能力;
  数据总线的宽度决定了CPU单次数据传输的传送量,也就是数据传输速度;
  控制总线决定了CPU对其他控件的控制能力以及控制方式

      简单的说32位的操作系统就是指:地址总线是32位的系统。那么,也就是说操作系统的位数决定了指针变量所占的字节数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-6 15:53:19 | 显示全部楼层
指针是用来存地址的。地址要用四个字节来表示。不管它是char还是int,它们的地址都是用四个字节表示的。地址就是你家门牌号。你说你家门牌号是几位数字还由你家住的什么人来决定吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 07:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表