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

C++中char* [3]与char (*)[3]的类型声明区别

区分 char* [3] 和 char (*)[3]:C++里的指针数组与数组指针

嘿,你问到点子上了——这俩确实很容易搞混,虽然写法只差了个括号,但C++里它们是完全不同的类型,咱们拆开了说清楚:

1. char* [3]:指针数组(Array of Pointers)

这是一个数组,里面装了3个char*类型的指针。你可以把它理解成“存放字符指针的数组”,每个元素都能指向一个字符串或者一块字符内存。

举个实际的代码例子:

#include <iostream>
int main() {
    // 初始化一个指针数组,每个元素指向字符串字面量
    char* str_array[3] = {"Apple", "Banana", "Cherry"};
    
    // 遍历数组,输出每个字符串
    for (int i = 0; i < 3; ++i) {
        std::cout << str_array[i] << std::endl;
    }
    
    // 看看这个数组的内存大小:3个指针的大小之和
    std::cout << "Size of str_array: " << sizeof(str_array) << std::endl;
    // 64位系统下是 3 * 8 = 24 字节
    return 0;
}

关键特性:

  • 本质是数组,不是指针,内存占用由元素数量和每个指针的大小决定
  • 当它作为函数参数传递时,会自动退化为char**(指向字符指针的指针),此时无法再获取原数组的大小信息
  • 常用场景:存储多个独立的字符串、管理多个字符缓冲区的指针

2. char (*)[3]:数组指针(Pointer to Array)

这是一个指针,专门用来指向一个“包含3个char元素的数组”。你可以把它理解成“指向固定大小字符数组的指针”,它的目标是整个数组,而不是单个指针。

同样上代码例子:

#include <iostream>
int main() {
    // 定义一个3元素的字符数组
    char char_array[3] = {'X', 'Y', 'Z'};
    // 定义数组指针,指向这个3元素数组
    char (*array_ptr)[3] = &char_array;
    
    // 访问数组元素:先解引用指针得到整个数组,再按下标访问
    for (int i = 0; i < 3; ++i) {
        std::cout << (*array_ptr)[i] << std::endl;
    }
    
    // 看看指针本身的大小:就是普通指针的大小
    std::cout << "Size of array_ptr: " << sizeof(array_ptr) << std::endl;
    // 64位系统下是8字节
    // 看看指针指向的数组的大小:3字节
    std::cout << "Size of *array_ptr: " << sizeof(*array_ptr) << std::endl;
    return 0;
}

关键特性:

  • 本质是指针,内存大小就是系统中指针的标准大小(和指向的数组大小无关)
  • 作为函数参数传递时,不会退化,依然保留“指向3元素char数组”的类型信息,因此可以通过解引用获取数组的大小
  • 常用场景:处理二维数组的行(比如char arr[5][3],每行都是3元素char数组,用char (*)[3]可以遍历每行)、需要严格保证指向固定大小数组的场景

核心差异对比

  • 类型本质:char* [3]是数组;char (*)[3]是指针
  • 内存占用:前者是3 * sizeof(char*);后者是指针本身的大小(如8字节)
  • 参数退化:前者作为函数参数退化为char**;后者保持原类型,不退化
  • 使用场景:前者存多个字符串/指针;后者指向固定大小的字符数组、处理二维数组

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:32:32