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

未解引用指针引发编译警告:char数组与指针类型匹配疑问

指向数组的指针与printf %s参数的类型匹配问题

警告信息

warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘char (*)[4]’ [-Wformat=]

问题代码

#include <stdio.h>
#include <stdlib.h>

int main(){
    char str_arr[4] = "abc";
    char (*p)[4];
    p = &str_arr;
    printf("A single character: %c\n",(*p)[1]);  
    printf("The entire string: %s\n",p); // 当我把p换成*p时警告消失,这是为什么?
    return 0;
}

原因解析

  • 先明确指针p的类型:char (*p)[4]是指向长度为4的char数组的指针,它存储的是整个数组str_arr的地址(&str_arr的类型就是char (*)[4],和p的类型完全匹配)。
  • printf的%s格式化符要求传入的参数是char*类型——也就是指向字符串首字符的指针。直接传p的话,p的类型是char (*)[4],和char*属于不同的指针类型,编译器会检测到类型不匹配,因此抛出警告。
  • 当你把参数换成*p时,*p是对指向数组的指针解引用,得到的是char[4]类型的数组。这里触发了C语言的核心规则:数组作为函数参数传递时,会自动隐式转换为指向数组首元素的指针。也就是说*p会被转换成char*类型(指向str_arr[0]的指针),完全符合%s的参数要求,所以警告消失。
  • 额外验证:你代码里的(*p)[1]能正确输出'b',这和str_arr[1]的效果一致,也能证明*p确实代表整个数组,通过下标可以直接访问数组元素。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 00:20:08