大妈学编程 发表于 2020-8-6 14:02:01

为什么32位操作系统的char指针是4个字节的?

如题,为什么32位操作系统的char指针是4个字节的?跟32位cpu的数据总线有关吗?一次可以处理32位的数据,所以是32bit/8 = 4Byte吗?
假如 64位的操作系统 ,但是用的是32位的cpu,一个char指针还是4个字节吗?这个是要看编译器的吗?

xiaosi4081 发表于 2020-8-6 14:02:52

32位和64位系统中,编译器为了相互兼容,所以指针都是4个字节长度。

zltzlt 发表于 2020-8-6 14:03:07

指针存储的是地址,占 4 个字节没毛病

baige 发表于 2020-8-6 14:03:33

本帖最后由 baige 于 2020-8-6 14:07 编辑

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


#include <stdio.h>

int main()
{
        char *p;
        printf("%d",sizeof(p));
        return 0;
}

baige 发表于 2020-8-6 14:10:45

这是64位编译器的运行结果


baige 发表于 2020-8-6 14:12:16

这是32位编译器


大妈学编程 发表于 2020-8-6 14:14:41

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

这个我之前百度了一波,好像是编译器的问题,64位系统 ,用64位的编译器可以得到8位的指针。但是不明白32位系统 ,指针大小4字节背后的原理。请大佬不吝赐教。

大妈学编程 发表于 2020-8-6 14:19:09

zltzlt 发表于 2020-8-6 14:03
指针存储的是地址,占 4 个字节没毛病

32位操作系统 ,使用32位来存储内存地址,所以32bit/8 = 4byte,是这样来的吗?

zltzlt 发表于 2020-8-6 14:19:46

大妈学编程 发表于 2020-8-6 14:19
32位操作系统 ,使用32位来存储内存地址,所以32bit/8 = 4byte,是这样来的吗?

是的

baige 发表于 2020-8-6 14:20:50

百度的:编译器一般默认32位的,32位寻址也就是32位二进制,转换成16进制就是8位,一个字节是两位16进制代码,8位就是4个字节

jackz007 发表于 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 个字符(拒绝杠精)?

风过无痕1989 发表于 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位的系统。那么,也就是说操作系统的位数决定了指针变量所占的字节数。

405794672 发表于 2020-8-6 15:53:19

指针是用来存地址的。地址要用四个字节来表示。不管它是char还是int,它们的地址都是用四个字节表示的。地址就是你家门牌号。你说你家门牌号是几位数字还由你家住的什么人来决定吗?
页: [1]
查看完整版本: 为什么32位操作系统的char指针是4个字节的?