在c++中利用指针实现动态数组

本文介绍了如何在C++中创建动态一维和二维数组,并通过示例代码展示了具体操作过程。同时,对比了C和C++两种不同风格的数组创建方式。

介绍:
        在c++中不能像java定义这样的数组 int[] arr = new int[],

         如果要根据程序的运行来实现动态数组在c++中可利用指针。

动态一维数组:
#include<iostream>
using namespace std;
int main()
{
     int len;
     cin>>len;
     int *p=new int[len];
     delete[] p;
     p = NULL;
     return 0;
}
动态二维数组:
int main()
{
     int row, col;
     cout << "Please enter the number for row and column: " << endl;
     cin >> row >>col;

     //为二维数组开辟空间
     int **p = new int*[row];
     for (int i = 0;  i < row;  i++)
    {
          p[i] = new int[col];
    }

     for (int j = 0;j < row; j++)
     {
          for (int k = 0; k < col; k++)
          {
               p[j][k] = (j + 1) * (k + 1);
               cout << p[j][k] << &p[j][k];
          }
          cout<<endl;
     }

     //释放二维数组占用的空间
     for (int m = 0; m < row; m++)
    {
          delete[] p[m];
    }
    delete[] p;
    p = NULL;
    return 0;
}
当然要利用指针可以实现多维数组,但是用利用STL中的vector应该更简单。
 

 

补充C和C++风格对比:

 

//这是C风格的
#include "malloc.h"   //使用malloc函数一定要嵌入这个头文件
      
int intt=10;
int inty=5;
 
int** array=(int**)malloc(sizeof(int*)*intt);
for(int i=0;i<intt;i++)
array[i]=(int *)malloc(sizeof(int)*inty);
 
 
//这是C++风格的
int intt=10;
int inty=5;
 
int** array=new int*[intt];
for(int j=0;j<intt;j++)
       array[j]=new int[inty];
### 使用C++指针实现动态数组C++中,通过使用指针可以创建和管理动态分配的内存来构建动态数组。这允许程序根据运行时的需求调整数组大小。 #### 动态数组的基本概念 当声明静态数组时,其大小是在编译期固定的;而动态数组则可以在运行期间改变尺寸。为了达到这一目的,通常会利用`new`运算符来请求一块堆上的存储空间,并返回指向这块区域起始位置的指针[^2]。 #### 创建动态数组 下面是一个简单的例子展示如何定义并初始化一个整型的动态数组: ```cpp int* dynamicArray; dynamicArray = new int[size]; // size 是所需的元素数量 ``` 这段代码首先声明了一个名为 `dynamicArray` 的指针变量用于保存新分配内存的位置。接着调用了 `new` 运算符指定要分配多少个连续的整数单元给这个新的动态数组。 #### 访问动态数组中的元素 一旦成功创建了动态数组之后就可以像访问常规数组那样对其进行索引操作了: ```cpp for(int i=0;i<size;++i){ dynamicArray[i]=value; // 给第 i 个元素赋值 value } ``` 这里展示了遍历整个数组并将特定值赋予每一个成员的方法。需要注意的是,在这种情况下下标的范围是从零到小于size之间的任意正整数值。 #### 删除动态数组 为了避免内存泄漏问题,在不再需要该动态数组的时候应该及时释放它所占用的空间。可以通过如下方式完成清理工作: ```cpp delete [] dynamicArray; ``` 上述语句告诉编译器回收之前由 `new[]` 分配出来的那片连续地址区间内的资源。注意这里的方括号表示我们正在处理一个多维或一维以上的对象集合而不是单个实例。 #### 完整示例 综合以上各个部分可得完整的动态数组实现样例如下所示: ```cpp #include <iostream> using namespace std; void main(){ const int SIZE = 5; // 创建动态数组 double *ptrDynamicArr = nullptr; ptrDynamicArr = new double[SIZE]; // 初始化数据 for (int index = 0; index < SIZE; ++index) { ptrDynamicArr[index] = static_cast<double>(index); } // 输出数据 cout << "Elements in Dynamic Array:" << endl; for (int idx = 0; idx < SIZE; ++idx) { cout << *(ptrDynamicArr + idx) << ' '; } delete[] ptrDynamicArr; // 清理动态数组 system("pause"); } ``` 此段代码实现了从创建、填充直到最终销毁的一个完整流程,同时也体现了指针作为间接寻址工具的重要性及其灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值