C++新手求助:如何理解int** outer = new int*[n];语句?
拆解C++语句
int** outer = new int*[n];(针对可变大小数组场景) 嘿,作为C++新手第一次碰到这种嵌套指针的动态分配,懵是很正常的!我来结合你提到的可变大小数组问题,一步步给你掰扯明白这条语句~
先搞懂左边的int** outer
outer是一个指向指针的指针,你可以把它想象成一个“文件夹目录”:
- 第一个
*表示它本身是个指针,指向的不是直接的整数,而是另一个指针; - 第二个
*表示那个被指向的指针,最终指向的是int类型的数据。
说白了,outer就是用来存一堆“整数数组的首地址”的容器。
再看右边的new int*[n]
这是C++里的动态堆内存分配操作:
new关键字负责在堆上申请一块内存空间(堆内存是可以灵活调整大小的,不像栈内存有固定限制);int*[n]表示我们要申请的这块内存,刚好能放下n个int*类型的变量——也就是n个指向整数数组的指针。
这一步相当于先给你n个空的“文件夹位置”,等之后你再给每个位置放一个不同长度的整数数组(也就是问题里的可变大小子数组)。
结合可变大小数组的实际场景理解
在那个问题里,我们需要处理n个长度不一样的整数数组,这条语句是搭建整个结构的第一步:
- 先用
new int*[n]申请n个指针的位置,把它的首地址赋值给outer; - 之后你会循环处理每个子数组,比如第
i个子数组长度是k,就执行outer[i] = new int[k];,给这个位置分配对应长度的整数数组; - 最后
outer就变成了一个“可以装不同长度数组的二维结构”,完美解决可变大小数组的存储需求。
举个接地气的小例子:
假设n=2,先执行int** outer = new int*[2];,这时候我们有了两个空的“指针位置”。然后给第一个位置分配3个整数的空间:outer[0] = new int[3];,给第二个位置分配2个整数的空间:outer[1] = new int[2];。现在outer[0]指向一个长度为3的数组,outer[1]指向长度为2的数组,完全符合问题要求~
小提醒
用new分配的堆内存不会自动释放,记得用完要清理哦!先循环释放每个子数组:delete[] outer[i];,最后再释放外层的指针数组:delete[] outer;,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Minh Huy
相关产品推荐
相关产品推荐

