分静态数组(栈)、动态数组(堆,malloc)两种。
1. 静态数组
(固定大小,编译时确定长度)
方式1:直接定义 // 定义长度为5的int数组,5个元素:a[0],a[1],a[2],a[3],a[4] int a[5]; 数组下标从0开始; a[5] 越界,不能访问。 方式2:定义同时初始化 // 全部初始化 int a[5] = {1,2,3,4,5}; // 部分初始化,没写的自动填0 int b[5] = {10,20}; // b[0]=10,b[1]=20, b[2]=b[3]=b[4]=0 // 不写长度,由初始化内容自动推断大小 int c[] = {1,3,5,7}; // 等价 int c[4] //注意:不能用变量来指定静态数组大小(标准C不支持变长数组VLA) int n = 5; int arr[n]; // 标准C错误,考试不要这么写! #define MAXN 100 int arr[MAXN];//是对的2. 动态数组
(malloc,运行时确定大小,堆上)
#include <stdio.h> #include <stdlib.h> int main() { int n = 5; int *arr = (int *)malloc(sizeof(int) * n); // 赋值 for(int i=0; i<n; i++){ arr[i] = i; } // 打印 for(int i=0; i<n; i++){ printf("%d ", arr[i]); } free(arr); // 释放内存 arr = NULL; return 0; } /* int n = 5; int *arr = (int*)malloc(sizeof(int) * n); - sizeof(int) :一个int占的字节; sizeof(int)*n 总共需要多少字节 - 返回值是 int* 指针,把它当成数组用,可以用 arr[i] 访问 - 使用完要释放: free(arr); arr = NULL; */考点:
1. malloc返回 void* ,C语言强制转换为 int*
2. 动态数组用完必须free,否则内存泄漏
3. 动态数组可以用变量n控制长度,这是它最大优势。
3. 举例说明
比如先序数组:
int pre[] = {1,2,4,5,3,6};
// 求数组元素个数
int n = sizeof(pre)/sizeof(pre[0]);
sizeof(pre) 是整个数组字节大小; sizeof(pre[0]) 是单个int字节,相除得到元素数量。
⚠️这个 sizeof 求长度只对静态数组有效;
如果是malloc出来的指针 int *arr , sizeof(arr) 得到的是指针大小,不能用来算数组长度!
快速对比