为啥我们使用指针而不是简单地创建特定大小的数组?

Posted

技术标签:

【中文标题】为啥我们使用指针而不是简单地创建特定大小的数组?【英文标题】:Why do we use pointers instead of simply creating an array of specific size?为什么我们使用指针而不是简单地创建特定大小的数组? 【发布时间】:2017-04-19 15:15:44 【问题描述】:

我是 C++ 新手,如果之前有人问过这个问题,我很抱歉,但我找不到。 为什么我们使用指针而不是简单地创建一个特定大小的数组?

  int** ary = new int*[rowCount];
   for(int i = 0; i < rowCount; ++i)
    ary[i] = new int[colCount];

int ary[rowCount][colCount]; 

这两者有什么区别? 我知道第一个适用于堆内存,第二个适用于堆栈,但为什么大多数人使用第一种方法?

【问题讨论】:

语言的效率/功能允许您使用内存位置而不是巨大的数据对象...... 因为你是 C++ 新手,你肯定会找到更多关于通过分配内存来引用事物的优点(和缺陷)的信息...... 想象一下。你要把一堆积木放在桌子上。桌子上有一堆垃圾。您是否愿意:1)将所有积木粘在一起,然后必须在桌子上的所有东西上移动以使其适合....或2)将积木放在桌子上适合的任何位置,然后只记住块在哪里。在这两种情况下,您对任何块一无所知,但您知道它们都在哪里。处理东西时的问题之一是,当您处理完块时,在这两种情况下,您都希望记住删除所有块。 您的两个代码 sn-ps 之间的主要区别是堆栈与堆分配。第一个将从堆中分配,而第二个将在堆栈上。第一个要求您使用显式的delete 语句手动释放内存,而第二个将在离开当前范围时自动释放。每个都适用于不同的场景,所以这取决于你想要做什么。 这些是新手 C++ 程序员在完成初始学习课程、书籍演示等时将学习的概念。这是从 C 继承的概念。 【参考方案1】:

一个区别是第二个只有在 rowCount 和 colCount 都是 constant expressions 时才会编译。另见Array declaration。

另一方面,即使这些变量在运行时发生变化,第一个也会编译。

顺便说一句,这一切都与 C 类似。如果您使用 C++,则最好使用std::vector 作为第一个选项,std::array 作为第二个选项。

【讨论】:

以上是关于为啥我们使用指针而不是简单地创建特定大小的数组?的主要内容,如果未能解决你的问题,请参考以下文章

为啥宁愿使用指向结构的指针而不是链表中的常规结构类型变量?

为啥使用用户定义的异常而不是简单地显示错误消息[重复]

为啥指针分配的内存在函数之后仍然存在,而不是数组?

二维数组名不能赋值给二级指针- -

如何将简单指针转换为固定大小的多维数组?

为啥不使用指针数组来优化链表而使用跳过列表呢?