当我们有常规数组时,为啥我们需要指向数组的指针?

Posted

技术标签:

【中文标题】当我们有常规数组时,为啥我们需要指向数组的指针?【英文标题】:Why do we need pointers to arrays when we have regular arrays?当我们有常规数组时,为什么我们需要指向数组的指针? 【发布时间】:2021-08-05 10:44:35 【问题描述】:

当我们已经有了简单的数组来存储数组数据时,还需要指针数组吗?我们已经可以使用数组来存储数据了;为什么我们要使用指向数组的指针?

int array[100];
int *ptr = new int[100]

【问题讨论】:

一些编程任务使用指针更容易执行,而其他任务,例如动态内存分配,则无法使用指针执行。 数组本质上是静态的,这意味着一旦声明了数组的大小,就不能根据用户的要求调整它的大小。而指针本质上是动态的,这意味着分配的内存可以在以后的任何时间点调整大小。数组在编译时分配,指针在运行时分配 您是否在质疑我们为什么需要指针或为什么需要动态内存分配? 你的堆栈有多大?你的堆有多大? 【参考方案1】:

使用动态分配的数组而不是局部变量的数组有几个原因。

    空间限制。如果将数组声明为局部变量,它通常存储在称为堆栈的内存区域中。堆栈的大小和空间有限,通常为数十兆字节,如果超过此空间,您的程序将崩溃。如果要处理大型数据集(例如数百兆字节),则需要使用动态分配。 (要看到这一点,请尝试创建一个包含 100,000,000 个整数的数组作为局部变量,并将它们全部设置为它们的索引。) 空间效率。当您知道需要多少空间时,动态分配允许您在运行时调整数组的大小。但是,局部变量数组必须具有固定大小。如果该大小太小,则无法存储所需的所有数据。如果它太大,就会导致内存使用效率低下。 数组生命周期。局部变量在其声明的块退出后立即不复存在。如果你使用本地数组,一旦声明它们的函数完成运行,数组内容就会不复存在。动态分配的对象在被明确清除之前一直存在。

【讨论】:

【参考方案2】:

空间限制。这是数组中详细指针的主要原因。这样我们只包含在数组中的变量和值将附加到该特定索引,这样就不会出现空间复杂度

【讨论】:

以上是关于当我们有常规数组时,为啥我们需要指向数组的指针?的主要内容,如果未能解决你的问题,请参考以下文章

当返回指向本地数组的指针时,为啥它总是相同的值?

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

为啥指向 char 数组的指针必须需要 strcpy 才能为其数组分配字符而双引号分配不起作用?

为啥我不能访问指向数组中成员函数的指针?

Go 切片内存分配

指针进阶 - 字符串与指针 & 数组与指针