C/C++中的动态数组
关于动态数组的作用,不言而喻,有了动态数组,我们将不再担心因为 数组大小而带来的而一些困扰。
一.下面先说一下c语言中的动态数组
1.1首先我们认识几个函数:
<caption> 关于动态内存分配的一些函数 </caption>
函数名 函数原型 功能 返回值 calloc void *calloc(unsigned n,unsign size) 分配n个数据项的内存连续空间, 每个数据项的大小为size 分配内存单元的起始地址,如不成功,返回0 free void *free(void *p); 释放p所指的内存区 无 mallloc void *malloc(unsigned size);
分配size字节的存储区间 所分配的内存起始区起始地址,如内存不够,返回0 realloc void *realloc(void *p,unsigned size); 将p所指出的已分配内存区的大小改为size,size可以比原来分配的空间大或小 返回指向该内存区的指针
calloc、malloc、realloc的区别可以点击查看
1.2下面来看个例子:
1.2.1用动态数组创建一维数组:
#include<stdio.h>
#include<stdlib.h>
int main() {
//一维数组的建立
int *array1;
int n1;
printf("你要建立的一维数组的大小:");
scanf("%d", &n1);
array1 = (int *)malloc(n1*sizeof(int));
int i;
for (i = 0; i < n1; i++)
scanf("%d", array1 + i);
for (i = 0; i < n1; i++)
printf("%d ", *(array1 + i));
free(array1);
return 0;
}
运行结果如下 :
1.2.2创建二维数组
#include<stdio.h>
#include<stdlib.h>
int main() {
int **array2;
int n1, n2;
printf("输入二维数组的维数:");
scanf("%d %d", &n1, &n2);
//申请空间
//第一维
array2 = (int **)malloc(n1 * sizeof(int));
/*第二维的申请没有第一维那么直接,可以理解,第一维存储的就是n1个指向二维的指针*/
int i,j;
for (i = 0; i < n1; i++) {
array2[i] = (int*)malloc(n2 * sizeof(int));
}
for (i = 0; i < n1; i++) {
for (j = 0; j < n2; j++) {
array2[i][j] = i + 2 * j; //直接赋值吧
printf("%d ", *(*(array2 + i) + j));
}
printf("\n");
}
for (i = 0; i < n1; i++)
free(*(array2 + i)); //free(array2[i])
free(array2);
return 0;
}
运行结果如下:
1.2.3扩展动态数组
这里主要用到realloc()这个函数。
#include<stdio.h>
#include<stdlib.h>
int main() {
int*n, *p;
int i, n1, n2;
printf("请输入所要创建的动态数组的长度:");
scanf("%d", &n1);
//下面语句也可以用n=(int *)malloc(n1*sizeof(int));
n = (int*)calloc(n1, sizeof(int));
for (i = 0; i < n1; i++) {
n[i] = i + 1;
printf("%d\t", n[i]);
}
printf("\n");
printf("请输入所要扩展的动态数组的长度:");
scanf("%d", &n2);
p = (int*)realloc(n, (n2) * sizeof(int));//动态扩充数组
for (i = 0; i < n1; i++)
printf("%d\t", n[i]);
for (i = n1; i < n2; i++)
{
p[i] = i + 1;
printf("%d\t", p[i]);
}
printf("\n");
free(p);
return 0;
}
运行结果:
1.2.4缩小动态数组
#include<stdio.h>
#include<stdlib.h>
int main() {
int*n, *p;
int i, n1, n2;
printf("请输入所要创建的动态数组的长度:");
scanf("%d", &n1);
n = (int*)calloc(n1, sizeof(int));
for (i = 0; i < n1; i++){
n[i] = i + 1;
printf("%d\t", n[i]);
}
printf("\n请输入所要缩小的动态数组的长度:");
scanf("%d", &n2);
p = (int*)realloc(n, (n2) * sizeof(int));
for (i = 0; i < n2; i++)
printf("%d\t", p[i]);
printf("\n");
free(p);
return 0;
}
运行结果:
二、C++中的动态数组
具体可参考C++primer第12章,这里只说一下它的简单用处:
主要是new 和delete,他们代替了传统的的c语言中的malloc等和free。
#include <iostream>
int main()
{
using namespace std;
int *a;
int n;
cout << "请输入你要申请的数组的长度:";
cin >> n;
a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = i;
cout << a[i]<<" ";
}
cout << "\n";
delete a;
system("pause");
return 0;
}
当然,c和C++并没有绝对的界限。
希望大家喜欢。