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
相关产品推荐
相关产品推荐

