αλε*_*λυτ 32 c++ arrays pointers backwards-compatibility
考虑以下代码:
int main() {
int (*p)[]; // pointer to array with unspecified bounds
int a[] = {1};
int b[] = {1,2};
p = &a; // works in C but not in C++
p = &b; // works in C but not in C++
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在纯C中,您可以指定指向任何维度的数组的此类地址的指针.但是在C++中你不能.我发现编译器允许为这样的指针赋值的一种情况:
struct C
{
static int v[];
};
int main()
{
int (*p)[] = &C::v; // works in C++ if 'v' isn't defined (only declared)
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但找不到此代码的任何有用案例.
任何人都可以给出一个有用的示例(在C++中)指向具有未指定边界的数组的指针吗?或者只剩下来自C的遗迹?
Ben*_*igt 12
这样的指针不能参加指针运算,仍然可以做可能有用的东西都用得到它的类型decltype或reinterpret_cast到另一个指针类型或intptr_t.这是因为第3.9p6节说:
类类型(例如"
class X")可能在翻译单元中的某个点处不完整,稍后会完成; 类型"class X"在两个点都是相同的类型.声明的数组对象类型可能是一个不完整类类型的数组,因此不完整; 如果稍后在翻译单元中完成类类型,则数组类型变为完整; 这两个点的数组类型是相同的类型.声明的数组对象类型可能是一个未知大小的数组,因此在翻译单元中的某一点不完整,稍后会完成; 这两个点的数组类型("未知边界的T数组"和"数组的数组NT")是不同的类型. 指向未知大小的数组或由typedef声明定义为未知大小数组的类型的指针类型无法完成.
5.3.1说:
注意:通过指向不完整类型(除了)之外的指针是有效的.由此获得的左值可以以有限的方式使用(例如,初始化参考); 这个左值不能转换为prvalue,见4.1.
cvvoid
由于数组到指针衰减可以在数组左值上执行而无需事先转换为右值,因此注释中留下的代码dyp是正确的:
(*p)[i]
Run Code Online (Sandbox Code Playgroud)
相关规则,从4.2开始:
一个左值或类型的数组的"右值
NT"或'结合的未知的阵列T’可以被转换成类型的prvalue'指针T’,其结果是一个指针数组的第一个元素.