C语言`char (*)[3]`与`const char *`指针不兼容报错疑问
结论
你的推断不正确,char (*)[3]不是指向指针的指针,它是指向长度为3的char类型数组的指针,和char**(指向char*的指针)是完全不同的两类指针。
语法规则说明
C语言中数组、指针复合类型的声明遵循优先级规则:
- 方括号
[]的优先级高于星号*,没有括号修饰时,char *arr[3]代表「长度为3的char*类型数组」,也就是包含3个字符指针的数组。 - 用
(*)包裹指针名后,char (*p)[3]代表p首先是一个指针,指向的对象是「长度为3的char数组」,这就是报错信息中提到的char (*)[3]类型。
你的代码中temp本身是char[3]类型的数组,对数组直接取地址&temp得到的就是指向整个char[3]数组的指针,类型刚好是char (*)[3]。
报错原因
strcat函数的第二个入参要求为const char *类型,即指向单个char字符的指针(通常传入字符串首字符的地址):
- 你传入
&temp时,入参是指向整个数组的指针,和要求的const char *类型不匹配,因此触发类型错误。 - 你改为直接传入
temp时,数组会自动隐式转换为指向首元素temp[0]的指针,类型为char*,和参数要求完全匹配,因此报错消失。
两类指针的本质差异
char (*)[3]和char**的核心区别是指针的步进长度不同:
char (*p)[3]执行+1操作时,地址会向前偏移3个字节,刚好跳过一个长度为3的char数组。char** pp执行+1操作时,地址会向前偏移一个指针的长度(32位系统为4字节,64位系统为8字节),和数组长度没有关联。
另外你的代码存在一处笔误:for循环初始化的是变量j,但循环判断条件用的是变量i,请注意检查避免后续逻辑错误。
内容的提问来源于stack exchange,提问作者jjkl
相关产品推荐
相关产品推荐

