C++动态分配数组

本文详细介绍了C++中动态分配一维和二维数组的方法,包括如何通过指针进行访问和使用。重点阐述了动态内存的优势及使用注意事项。

《C++教程》郑莉、李宁,人民邮电出版社,2010年第一版。P59动态分配数组


一、动态分配一维数组

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
	int* p = new int[5];//将动态数组起始地址赋给指针p
	int i;
	for (i = 0;i<5;i++)
	{
		p[i] = i;
		cout<<setw(4)<<p[i];
	}
	cout<<endl;
	delete[] p;
	return 0;

}
动态分配内存解决了运行时确定数组大小的问题,但是这样的数组是没有名字的,只能通过地址来访问。本例中,将new操作得到的动态数组起始地址赋给指针p,这样*p,*(p+1).......*(p+i)就依次是数组中下标为0、1……i的元素。其实数组名就是数组的起始地址,那我们现在得到了数组的起始地址,可否将p当做数组名用呢?当然可以。因此访问元素我们还可以用p[0]、p[1]……p[i]的形式。


二、动态分配二维数组


#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
	int (*p)[3];//后面的[3]是必需的
	p = new int[2][3];
	int i,j;
	for (i=0;i<2;i++)
	{
		for (j=0;j<3;j++)
		{
			p[i][j] = i*j;
			cout<<setw(4)<<p[i][j];
		}
		cout<<endl;
	}
	return 0;

}

本例创建了一个2*3的二维数组,它实际上是由两个一维数组构成的,每个一维数组有3个元素,因此需要声明一个指向一维Int数组的指针p。指针p接收了二维数组的首地址后,既可以作为数组名来使用(如p[i][j]),也可以以指针运算的方式访问数组元素(如*(*(p+i)+j))。C++标准规定,一个n维数组的数组名,如果出现在表达式中,就会立刻被转换成指向n-1维数组的指针,如果对这个指针执行*运算,其结果就是一个n-1维数组,并且也被转换成指针(指向n-2维数组的)。



C++ 中,动态分配数组长度是一种常见的需求,尤其是在处理不确定大小的数据集合时。动态分配允许程序在运行时根据需要分配内存,而不是在编译时固定数组大小。以下是几种常见的动态分配数组长度的方法。 ### 使用 `new` 和 `delete` 进行动态分配 C++ 提供了 `new` 操作符用于在堆上动态分配内存,并使用 `delete[]` 来释放数组内存。这种方法适用于一维数组和多维数组动态分配。 #### 一维数组动态分配示例: ```cpp int n; std::cin >> n; int* arr = new int[n]; // 动态分配一个长度为 n 的整型数组 // 使用数组 for (int i = 0; i < n; i++) { arr[i] = i * 2; } // 释放内存 delete[] arr; ``` #### 二维数组动态分配示例: ```cpp int n; std::cin >> n; int** matrix = new int*[n]; // 分配行指针 for (int i = 0; i < n; i++) { matrix[i] = new int[n]; // 为每一行分配列 } // 使用二维数组 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { matrix[i][j] = i * n + j; } } // 释放内存 for (int i = 0; i < n; i++) { delete[] matrix[i]; // 先释放每一行 } delete[] matrix; // 再释放行指针数组 ``` ### 使用 `malloc` 和 `free` 进行动态分配C++ 中也可以使用 C 语言的 `malloc` 和 `free` 函数进行动态内存分配。这种方式在需要与 C 代码兼容或进行底层内存管理时非常有用。 #### 示例: ```cpp int n; std::cin >> n; int* arr = (int*)malloc(n * sizeof(int)); // 动态分配一个长度为 n 的整型数组 // 使用数组 for (int i = 0; i < n; i++) { arr[i] = i * 2; } // 释放内存 free(arr); ``` ### 动态数组的扩展 在某些情况下,可能需要在程序运行过程中扩展数组的长度。此时可以通过重新分配更大的内存空间并将原有数据复制到新空间来实现。 #### 示例: ```cpp #include <stdio.h> #include <malloc.h> typedef struct { int* data; int length; int maxsize; } seqlist; void initlist(seqlist& l) { l.data = (int*)malloc(10 * sizeof(int)); // 初始分配10个整型的空间 l.length = 0; l.maxsize = 10; } void increaselist(seqlist& l, int len) { int* p = l.data; l.data = (int*)malloc((l.maxsize + len) * sizeof(int)); // 扩展指定长度的空间 for (int i = 0; i < l.length; i++) { l.data[i] = p[i]; // 复制原有数据 } l.maxsize += len; // 更新最大长度 free(p); // 释放旧空间 } ``` ### 获取动态数组的长度 C++ 并没有内置的方法来获取动态分配数组的长度,但可以使用 `_msize`(在 Windows 平台上)等函数来获取分配的内存大小,并结合元素大小计算出数组长度。 #### 示例: ```cpp #include <iostream> using namespace std; #define GET_DYNAMIC_ARRAY_LEN(array, len) { len = _msize(array) / sizeof(array[0]); } int main() { int* a = new int[100]; int len; GET_DYNAMIC_ARRAY_LEN(a, len); // 获取动态数组的长度 cout << len; // 输出 100 } ``` ### 总结 C++ 提供了多种方式进行数组动态分配,包括 `new`/`delete`、`malloc`/`free` 等方法,适用于不同的使用场景和需求。同时,动态数组的扩展和长度获取也可以通过自定义函数或宏定义来实现[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值