You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++:char类型占1字节,为何char指针占用8字节?代码疑问解析

为什么char指针的sizeof结果是8字节而不是1字节?

嘿,我完全懂你现在的困惑——刚接触指针的时候,很容易把「指针本身的大小」和「指针指向的数据的大小」搞混,咱们一步步把这个问题拆明白:

核心误区:指针的大小和指向的类型无关

指针本质上就是一个内存地址,它的作用是告诉你「某个数据在内存里的具体位置」。不管它指向的是1字节的char、4字节的int还是更大的自定义结构体,指针自身的大小只取决于你的操作系统架构:

  • 在64位系统下,内存地址是64位的,所以需要8字节来存储这个地址,这就是你看到sizeof(p_character)返回8的原因
  • 如果是32位系统,这个值会变成4字节

你误以为char指针应该占1字节,其实是把「指针指向的char数据的大小」和「指针自身的大小」搞混了。如果想查看指针指向的数据的实际大小,你应该用sizeof(*p_character),这个操作会返回1字节——也就是char类型本身的大小。

为什么函数里的指针看起来像数组?

你提到在ShowCharacter函数里,指针表现得像数组——这其实是C++的一个特性:当你把数组作为参数传递给函数时,它会自动退化成指向数组首元素的指针。所以函数参数里的char *p_character和char p_character[]是完全等价的,此时sizeof(p_character)求的依然是指针的大小,而不是数组的总大小。

如果想要获取数组的总大小,你得额外把数组的长度作为参数传递给函数,或者用模板推导数组长度(这属于进阶内容啦)。

用你的代码验证区别

咱们修改你的代码,加上查看*p_character大小的逻辑,就能直观看到两者的差异:

#include <iostream>
#include <conio.h>
using namespace std;

void ShowCharacter(char *p_character);

int main() {
    char character = '\0', *p_character;
    p_character = &character;
    
    // 指针自身的大小:64位系统下为8
    int ptr_size = sizeof(p_character);
    // 指针指向的数据的大小:char类型固定为1
    int data_size = sizeof(*p_character);
    
    cout << "Pass a variable 'char character' as a pointer!" << endl;
    character = getch();
    ShowCharacter(p_character);
    
    cout << "Character (main): " << character 
         << " | 指针大小: " << ptr_size 
         << " | 指向的数据大小: " << data_size << endl;
    return 0;
}

void ShowCharacter(char *p_character) {
    char letter = p_character[0];
    int ptr_size = sizeof(p_character);
    int data_size = sizeof(*p_character);
    
    cout << "Character (ShowCharacter): " << letter 
         << " | 指针大小: " << ptr_size 
         << " | 指向的数据大小: " << data_size << "\n";
    return;
}

运行这段代码后,你会看到指针大小始终是8,而指向的数据大小固定为1,这样就能彻底区分两者的区别了。

内容的提问来源于stack exchange,提问作者Konata Izumi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 13:27:47