C++ 不允许定义“指向数组引用的指针”,因为引用不是对象、不可取地址;合法的是指向数组的指针(如 int (*)[5]),其解引用得到数组引用(int (&)[5])。

不存在“指向数组引用的指针”这种东西
直接说结论:C++ 语法不允许定义“指向数组引用的指针”。int (&)[5] 是一个数组引用类型,而引用本身不是对象,没有地址,不能取地址,自然也不能有指针指向它。
你真正想表达的,大概率是以下三种之一:
- 指向数组的指针(
int (*)[5]) - 引用数组的指针(语法错误,但常被误写)
- 指向数组元素的指针,再通过某种方式关联到整个数组(比如
int*+ 长度)
正确写法:指向数组的指针用 int (*)[N]
这是最接近你原意、且合法的类型。它是指向一个含 N 个 int 的数组的指针,解引用后得到的是数组引用(int (&)[N])。
示例:
立即学习“C++免费学习笔记(深入)”;
int arr[3] = {1, 2, 3};
int (*p)[3] = &arr; // ✅ 合法:p 是指向 int[3] 的指针
int (&ref)[3] = *p; // ✅ *p 类型就是 int(&)[3]
注意:&arr 和 &arr[0] 数值相同但类型不同:&arr 是 int (*)[3],&arr[0] 是 int*。混用会导致类型不匹配或隐式转换丢失维度信息。
为什么 int* (&)[5] 不行?
这个写法试图声明“对含 5 个 int* 的数组的引用”,不是“指向引用的指针”。而如果你真写 int (&)[5]* p;,编译器会报错——语法非法,因为 int (&)[5] 是一个引用类型,不能作为 * 的左操作数。
常见错误现象:
-
error: declaration of 'p' as array of references(当你误写成int (&p)[5];却又加了*) -
error: cannot declare pointer to 'int (&)[5]'(Clang/GCC 明确拒绝) - 把
int* p = &arr;当作“指向数组引用的指针”,实际只是指向首元素,丢失长度信息
替代方案:用 std::array 或模板推导更安全
原始数组指针容易出错,尤其在传递和类型推导时。现代 C++ 更推荐:
- 用
std::array<int, 5>&接收数组引用(类型安全、可 sizeof、支持范围 for) - 函数参数写成模板:
template<size_t N> void f(int (&arr)[N]),自动推导 N - 避免裸指针,除非对接 C API 或性能关键路径
例如:
template<size_t N>
void process(const int (&arr)[N]) {
static_assert(N == 5, "expected array of size 5");
// arr 是 int(&)[5],安全可用
}
真正的难点不在语法拼写,而在区分“引用”“指针”“数组类型”三者的绑定时机和生命周期——&arr 没问题,&(local_array) 如果 local_array 是栈上局部变量,那指针就悬了。


















