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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:04:58