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

C++指针类型定义疑问:同一行声明变量为何类型不同?

为什么int* a,b;中&a和&b的类型不同?

这并非编译器的异常行为,而是C++声明语法的固有特性——指针修饰符*仅绑定到紧跟的变量名,而非作用于整个声明语句中的所有变量。

第一种情况分析

代码示例:

#include <iostream>
#include <typeinfo>

int main(int argc, char** argv)
{
    int* a,b;
    
    std::cout << typeid(&a).name() << std::endl;
    std::cout << typeid(&b).name() << std::endl;

    return 0;
}

这段代码里的int* a,b;完全等价于:

int *a;
int b;
  • a是int*类型的指针,对其取地址&a得到的是指向指针的指针,类型为int**,对应输出的PPi(其中P表示指针,Pi即int*,PPi即int**)。
  • b是普通的int类型变量,对其取地址&b得到的是指向int的指针,类型为int*,对应输出的Pi。

第二种情况分析

代码示例:

#include <iostream>
#include <typeinfo>

int main(int argc, char** argv)
{
    int* a;
    int* b;

    std::cout << typeid(&a).name() << std::endl;
    std::cout << typeid(&b).name() << std::endl;

    return 0;
}

这里a和b都被单独声明为int*类型,因此对它们取地址后得到的都是int**类型,输出自然都是PPi,符合预期。

总结建议

这种语法规则继承自C语言,为了避免类似混淆,建议在声明指针变量时,每个变量单独一行声明并带上*,不要在同一行混合声明指针和非指针变量,也不要错误认为*会作用于整行的所有变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:45:16