C++总结——C/C++中的动态数组

关于动态数组的作用,不言而喻,有了动态数组,我们将不再担心因为  数组大小而带来的而一些困扰。

一.下面先说一下c语言中的动态数组

1.1首先我们认识几个函数:

关于动态内存分配的一些函数
函数名函数原型功能返回值
callocvoid *calloc(unsigned n,unsign size)分配n个数据项的内存连续空间, 每个数据项的大小为size分配内存单元的起始地址,如不成功,返回0
freevoid *free(void *p);释放p所指的内存区
malllocvoid *malloc(unsigned size);
 
分配size字节的存储区间所分配的内存起始区起始地址,如内存不够,返回0
reallocvoid  *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++并没有绝对的界限。

希望大家喜欢。

  

在这个问题,用户提供了两段代码,分别是引用\[1\]和引用\[2\]。这两段代码都是用来在一个数组查找指定数的位置。 引用\[1\]是一个C++代码示例,它使用了iostream和stdio.h头文件,并使用了命名空间std。代码使用了一个while循环来不断读取输入的n值,然后创建一个大小为n的整型数组a,并通过for循环读取数组的元素。接下来,代码读取了一个整数m,并使用for循环遍历数组a,查找是否有与m相等的元素。如果找到了相等的元素,则将其位置赋值给变量t,并跳出循环。最后,根据t的值输出结果。 引用\[2\]是另一个C代码示例,它使用了stdio.h头文件。代码同样使用了一个while循环来不断读取输入的n值,然后创建一个大小为n的整型数组a,并通过for循环读取数组的元素。接下来,代码读取了一个整数m,并使用for循环遍历数组a,查找是否有与m相等的元素。如果找到了相等的元素,则将其位置赋值给变量count,并将flag设置为1,表示找到了。最后,根据flag的值输出结果。 综上所述,这两段代码都是用来在一个数组查找指定数的位置。它们的实现方式略有不同,但都能达到相同的目的。 #### 引用[.reference_title] - *1* [1143: 零起点学算法50——数组查找数](https://blog.csdn.net/weixin_43965597/article/details/113104995)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [问题 C: 零起点学算法82——数组查找数](https://blog.csdn.net/chenhannan0024/article/details/127568844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值