C语言指针的大小由操作系统位数决定:在32位系统中为4字节(32位),在64位系统中为8字节(64位),且与指针指向的数据类型(如int、char或double)无关,仅取决于操作系统架构和编译器。

  1. 32位操作系统

    • 指针大小为4字节(32位)
    • 原因:32位系统的地址总线是32位的,能够表示的地址范围是2^32个(0到2^32-1),需要4个字节(32位)来存储
  2. 64位操作系统

    • 指针大小为8字节(64位)
    • 原因:64位系统的地址总线是64位的,能够表示的地址范围是2^64个,需要8个字节(64位)来存储

重要说明

  • 指针的大小与它指向的数据类型无关,无论指针指向的是char(1字节)、int(4字节)、double(8字节)还是其他类型,指针本身的大小在相同平台上是相同的
  • 这个大小是由操作系统位数(32位或64位)和编译器决定的,不是由指针类型决定的
  • 例如,在64位系统上,int*、char*、double*等所有类型的指针大小都是8字节

这可以通过以下C语言代码验证:

#include <stdio.h>
int main() {
    int *p1;
    char *p2;
    double *p3;
    void *p4;
    
    printf("Size of int pointer: %zu bytes\n", sizeof(p1));
    printf("Size of char pointer: %zu bytes\n", sizeof(p2));
    printf("Size of double pointer: %zu bytes\n", sizeof(p3));
    printf("Size of void pointer: %zu bytes\n", sizeof(p4));
    
    return 0;
}

在32位系统上运行,所有指针的大小都会输出为4字节;在64位系统上运行,所有指针的大小都会输出为8字节。