为啥我们使用指针而不是简单地创建特定大小的数组?
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
作为第二个选项。
【讨论】:
以上是关于为啥我们使用指针而不是简单地创建特定大小的数组?的主要内容,如果未能解决你的问题,请参考以下文章