亲爱的盆友们大家好,我们都知道,在C语言中如果要使用数组,就必须提前设置好数组大小
eg: int arr[100], char arr[100], 不能设置 int arr[ ] 否则电脑会报错,
因为电脑比较“笨”,咱们不告诉它,它就不知道应该给数组分配多少内存空间。
(有一个不算例外的例外:char arr[ ] =" I Love China! " 这是个字符串,初始化的时候系统会自动计算大小,并且不可以进行更改)
不过在c语言,c++中,可以通过malloc函数来创建动态数组,
malloc 向系统申请分配指定内存空间:size个字节。返回类型是 未指定类型的指针 :void* 类型。
————调用头文件 #include<stdlib.h>
#include<stdio.h>
#include<stdlib.h>
————malloc函数实例化:
1、 指针
int*p1 =(int*)malloc(sizeof(int));
(int *) 为强制类型转换,将 (void*) 转换为整形指针
(sizeof(int)) 为分配内存大小,一个整形大小(4个字节)
2、数组
int* arr = (int*)malloc(n * sizeof(int));
(n * sizeof(int)) 同上,为分配 n * 4 的字节内存大小
arr指向数组首地址
和arr[10]中 arr 为 arr[0] 的地址 用法相同
// 1、创建整形指针
int*p1 =(int*)malloc(sizeof(int));
// 字符型指针
char *p2=(char*)malloc(sizeof(char));
char *p2=(char*)malloc(1);
// 2、创建数组arr[]
int* arr = (int*)malloc(n * sizeof(int));
————数据排序
// 数组按照从小到大的顺序输出 插入法排序
for ( i = 1; i < n; i++)
{
int z = arr[i];
for ( j = i - 1; j >= 0; j--)
{
if (z < arr[j])
{ // 将大数向后移动一位(此时两个数相同),方便 z 的插入(覆盖前数)
arr[j + 1] = arr[j];
}
else
break;
}
// arr[i] <= arr[j],将 z 覆盖到 arr[j+1]
arr[j + 1] = z;
}
————内存释放
通过free(arr);
手动释放掉 arr[n]所占用的内存
(其实咱们不释放它也没关系的,函数执行完毕后,系统会帮我们释放掉的,不过啊,
虽然电脑每天任劳任怨、毫无怨言,可是如果它那天“心情不好”,冷不丁地给咱们报个错,那咱上呢说理啊,哈哈)
所以呢大家还是动动发财手把代码写完整比较好哦。
————完整代码实例
// 创建动态数组
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i, j;
// 输入数组大小
int n;
printf("请输入数组大小:");
scanf_s("%d", &n);
// 创建数组arr[]
int* arr = (int*)malloc(n * sizeof(int));
for ( i = 0; i < n; i++)
scanf_s("%d", &arr[i]);
// 插入法排序
for ( i = 1; i < n; i++)
{
int z = arr[i];
for ( j = i - 1; j >= 0; j--)
{
if (z < arr[j])
{
arr[j + 1] = arr[j];
}
else
break;
}
arr[j + 1] = z;
}
for (i = 0; i < n; i++)
printf("%d ", arr[i]);
printf("\n");
// 释放数组
free(arr);
return 0;
}
我也是一名大一学生,无意看到了这个有趣的动态数组,就想来说一说自己的理解,
在帮助其他朋友的同时也可以巩固自己,十分欢迎各位朋友、大佬在评论区发表见解以及指正不足。