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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:06:05