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

C++数组声明中noptr-declarator的定义及语法疑问

为什么int *array_of_pointers[3]无需括号但char (*pointer_to_abc_array)[3]必须加?

你误解了cppreference那条规则的具体场景——它并不是说所有带*的数组声明都要加括号,而是当你需要让*/&/&&先和变量名绑定,而非让后面的[]优先绑定的时候,才必须用括号包裹。本质是C++声明语法的优先级问题:[](数组下标)的优先级高于*(指针)、&(左值引用)、&&(右值引用)。

先看你的第一个例子:指针数组

// compiles fine without () ???
// array of (3 pointers to int)
int x = 1, y = 2, z = 3;
int *array_of_pointers[3] = { &x, &y, &z };

这里编译器按照优先级解析:先处理array_of_pointers[3](一个大小为3的数组),然后把数组的元素类型定为int*(指向int的指针)。这完全符合你的需求——你本来就想声明一个“装了3个int指针的数组”,所以不需要括号,语法本身就支持这种写法,和cppreference的规则不冲突。

再看第二个例子:指向数组的指针

char abc[3] = {'a', 'b', 'c'};
// pointer to (array of 3 chars)
char (*pointer_to_abc_array)[3] = &abc;

如果不加括号写成char *pointer_to_abc_array[3],编译器会优先解析pointer_to_abc_array[3](大小为3的数组),元素类型是char*——这就变成了“装了3个char指针的数组”,完全不是你想要的“指向3元素char数组的指针”。

这时候才触发cppreference的规则:你需要让*先和pointer_to_abc_array绑定(表示这是一个指针),再让后面的[3]修饰这个指针指向的类型(表示指针指向的是大小为3的char数组),所以必须用括号把(*pointer_to_abc_array)包裹起来,强制改变优先级。

总结cppreference规则的正确理解

规则里的“noptr-declarator若以*、&或&&开头,必须用括号包裹”,特指当你要声明“指向数组的指针”“引用数组的引用”这类类型时——此时*/&/&&是用来修饰变量本身的,而非修饰数组元素的,所以必须用括号让它们优先和变量绑定,避免被[]的优先级截断。而指针数组的场景中,*是修饰数组元素的,不是修饰变量本身的,所以不属于规则的适用范围。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:52:07