未解引用指针引发编译警告: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
相关产品推荐
相关产品推荐

