C语言中为何字符数组变量可赋值给指针,而其地址却不行?
为什么
pStringy = &stringy无法编译? 核心原因是两种写法的指针类型不匹配:
第一种合法场景:
char stringy[] = "There's too much confusion, I can't get no relief!"; char *pStringy; pStringy = stringy;在C语言的多数表达式语境中,数组名
stringy会自动转换为指向数组首元素的指针,等价于&stringy[0],它的类型是char *,和pStringy的类型完全一致,因此赋值操作合法,编译器可以正常通过。第二种非法场景:
char stringy[] = "There's too much confusion, I can't get no relief!"; char *pStringy; pStringy = &stringy;&stringy取的是整个数组的地址,它的类型是char (*)[N](其中N是该字符数组的实际长度,包含字符串末尾的'\0'),这是一个「指向字符数组的指针」;而pStringy是「指向单个字符的指针」(char *)。两者属于不兼容的指针类型,C语言不允许直接进行跨类型赋值,因此编译会报错。
如果非要让第二种写法通过编译,可以使用强制类型转换:
pStringy = (char *)&stringy;
但这种写法完全没必要,直接使用stringy就能得到首元素的指针,更符合C语言的惯用写法。
内容的提问来源于stack exchange,提问作者Bennypr0fane
相关产品推荐
相关产品推荐

