什么是"应是一个指针,指向字符类型的数组的初始元件"在C99 7.19/C11 7.21意思?

Pas*_*uoq 1 c printf pointers language-lawyer c11

最近的C标准规定了printf("%s",p):

如果不存在l长度修改器,则参数应该是指向字符类型数组的初始元素的指针

这是否意味着p必须与之相容char *,或者是否应该以更宽松的方式解释这句话?标准的其他部分是否通过"一系列字符类型"澄清了这里的确切含义?

为什么这样重要:如果这句话是严格解释为意味着p必须与兼容char *,一个重要的后果是,unsigned char *p; … printf("%s", p);是在编译平台,不确定char的签名,const char *p; … printf("%s", p);是不确定的.

chu*_*ica 10

这三种类型char,signed char以及unsigned char统称为字符类型.......
C11 6.2.5 15

因此,一个"字符类型"数组将涵盖这3个.

const,, volatilerestrict是各种类型的限定符,属于同一类型.它们也适用.

到目前为止提到的任何类型都是不合格的类型.每个不合格的类型有多个合格版本的类型,对应于一个的组合,两个或全部三个const,volatilerestrict预选赛.类型的限定或非限定版本是属于相同类型类别且具有相同表示和对齐要求的不同类型.派生类型不是由派生类型的限定符(如果有)限定的.
C11 6.2.5 26