C++ 二维指针数组

C++ 二维指针数组,c++,arrays,c++14,C++,Arrays,C++14,声明二维指针数组的代码如下: int x; cin>>x; int** pointerx = new int*[x]; for(int i = 0; i<x;i++){ pointerx[i] = new int[x]; } 使用第1个代码而不是第2个代码有什么缺陷吗?反之亦然。第一组代码是一个int指针指针,您指向指向int的指针,或者在本例中是一个int指针数组,因此指针x[i]实际上不包含int,而第二位代码将是指向int的2D数组的指针,因此指针x[i][i

声明二维指针数组的代码如下:

int x;
cin>>x;

int** pointerx = new int*[x];
for(int i = 0; i<x;i++){
    pointerx[i] = new int[x];
}

使用第1个代码而不是第2个代码有什么缺陷吗?反之亦然。

第一组代码是一个int指针指针,您指向指向int的指针,或者在本例中是一个int指针数组,因此指针x[i]实际上不包含int,而第二位代码将是指向int的2D数组的指针,因此指针x[i][i]实际上会给你一个int


如果需要更好的解释,请随时发表评论

int*pointerx[x][x]在C++14中不合法。它被添加到早期草案中,但在最终规范之前就被删除了

使用编译器扩展的主要缺陷有:

  • 您的代码可能无法在其他编译器或同一编译器的其他版本上工作(或以不同方式工作)
  • 通常没有关于代码功能的详细说明文档,因此如果代码不工作,很难获得支持
如果您查看C标准中的文本可变修改类型,您将看到它出现在许多地方;允许可变长度数组的效果是“蝴蝶效应”,它最终会影响语言中的许多其他方面


例如,如果
int*pointerx[x][x],编译器是否也支持
int*(*y)[x]==pointerx
它是否正确处理
sizeof*y
?也许是这样;您的编译器文档是否也描述了这一点?

使用
vector
如果您的雇主要求您在不使用STL的情况下编写容器,该怎么办?第一个和第二个是不同的。仔细观察。说服他们,或者找一个新雇主,或者找到免费的矢量参考代码,把它弄乱一点,包括进去,希望他们不会注意到。@voltaa7那么你应该实现你自己的矢量类,因为它确实有更好的可维护性。如果这是一项大学任务,可维护性并不重要,我需要解释!谢谢你告诉我这在c++14中是不合法的,我想是的。不
int*(*y)[x]==pointerx
给出了一个错误,并且
sizeof*y
工作正常。这实际上意味着什么:
int*(*y)[x]==指针
回到主要问题
int*指针[x][x]
是一个可变长度数组,编译器允许它通过扩展,因为我仍然使用c++11;它在某些场景中是否提供了任何优势(这就是为什么它被包含在扩展中!)。这些场景是什么?陷阱是什么?我已经列出了陷阱(在我看来)。弊大于利。您可以使用标准技术。
int* pointerx[x][x];