一句话区分
cpp
char csConnectName[256]; // 字符数组:**一块连续256字节,存1个字符串**
char(*csConnectName)[256]; // 数组指针:**一个指针变量,指向【一个大小为256的char数组】**
语法记忆:
(*csConnectName)括号不能少;char *csConnectName[256];是指针数组,完全是另一个东西,千万别搞混。
1. char csConnectName256;
- 类型:
char[256],栈 / 全局静态内存,直接分配 256 字节 - 含义:存放单个字符串 ,最多 255 有效字符 +
\0
cpp
char csConnectName[256];
strcpy(csConnectName, _T("MyConnect1")); //直接用
- 当数组名传给函数,会退化为 char* 指针(指向首元素)。
2. char (*csConnectName)256; 数组指针
- 它本身只是一个指针(32 位 4 字节 /64 位 8 字节) ,不会自动分配 256 字节内存!
- 它只能保存某个
char[256]数组的地址 - 指针的步长:
csConnectName + 1→ 地址增加 256 字节(跳过一整个 256 字符数组)
使用示例
cpp
char buf[256];
char(*csConnectName)[256];
csConnectName = &buf; // ✅ 取整个数组的地址,赋值给数组指针
// 访问buf里面内容:(*csConnectName) 就是buf数组
strcpy((*csConnectName), "test");
重点:赋值必须写
&buf,不能直接写csConnectName = buf;buf退化成char*,类型不匹配,编译器报警。
3. 最常用场景:数组指针用来指向二维字符数组
cpp
// 二维数组:3个字符串,每个字符串最多256字节
char arr[3][256];
char(*p)[256];
p = arr; // arr 等价于 &arr[0],arr[0]是char[256]
strcpy(p[0], "连接1");
strcpy(p[1], "连接2");
这里p[0]等价(*p),p[1]等价*(p+1),非常适合一组固定长度字符串列表,工控配置、多连接名称很常用。
4. 对比表格
表格
| 表达式 | 本质 | 占用内存 | 内存分配 |
|---|---|---|---|
char csConnectName[256]; |
字符数组 | 256 字节 | 定义时直接分配内存 |
char(*csConnectName)[256]; |
数组指针 | 4/8 字节 | 仅指针,不自带 256 字节内存,需要自己绑定一个数组 |
5. 容易踩坑的混淆对比(高频易错)
cpp
char *csConnectName[256]; // 指针数组:256个char*指针,不是数组指针!!
char (*csConnectName)[256]; // 数组指针:1个指针,指向char[256]
使用场景(机器人 / 连接名称)
- 如果你只需要存 1 个连接名称 :直接用
char csConnectName[256];,最简单。 - 如果你需要多个连接名称,每个名字固定最多 256 字符 ,二维数组,才用数组指针
char(*p)[256]。