已有常规数组存储数据时,为何还需要使用指向数组的指针?
指向数组的指针的存在意义与适用场景
你给出的两段代码刚好是栈上静态数组、堆上动态数组的典型声明方式,两者的使用场景差异很大,指向数组的指针存在的必要性主要体现在静态数组无法覆盖的几类场景:
- 数组长度需要在运行时确定
你写的int array[100]这类静态数组,长度必须是编译期就能确定的常量,无法适配长度需要动态变化的场景,比如根据用户输入的数量存储数据、根据接口返回的结果长度分配内存等。这时候就需要用new在堆上申请对应长度的内存,用指针持有这个动态数组的首地址,长度可以完全由运行时的逻辑决定。
示例:int userCnt; std::cin >> userCnt; // int userScore[userCnt]; 标准C++不支持这种变长栈数组,仅部分编译器有扩展支持 int *userScore = new int[userCnt]; // 完全符合标准,长度随运行时输入变化 - 数组生命周期需要手动控制
栈上的静态数组会在所在代码块执行结束后自动被系统回收,如果你需要把数组内容传递到代码块外部使用(比如作为函数返回值返回给调用方),直接返回栈数组的地址会触发野指针问题,访问非法内存。而堆上分配的数组的生命周期完全由开发者控制,只要不主动调用delete[]释放,内存就会一直可用,通过指针传递就能实现跨作用域的数组使用。 - 需要分配大内存数组
程序的栈空间大小非常有限,常规情况下只有几MB,如果你需要存储百万级、千万级元素的数组,直接在栈上声明会直接触发栈溢出导致程序崩溃。而堆空间的上限基本和系统可用内存挂钩,大内存数组必须通过指针在堆上申请分配。 - 更灵活的数组操作
指针支持偏移运算,如果你只需要操作原数组的某一段子序列,直接把指针偏移到对应起始位置就可以当作新数组使用,不需要额外拷贝数据,可以大幅提升运行效率。
内容的提问来源于stack exchange,提问作者daud nasir
相关产品推荐
相关产品推荐

