数组就是在程序中充当容器功能的一种数据类型。
数组有三大特征: - 连续 - 大小固定 - 类型一致
1.数组的定义
a)静态分配 例如分配一个长度为5的整型数组。
#include <stdio.h>
int main() {
int arr[5]= {1,2,3,4,5};
for(int i=0; i<5; i++) {
printf("%d ",arr[i]);
}
printf("\n数组占用字节数:%d\n",sizeof(arr));
//c语言不会检查数组下标越界
printf("arr第六个元素是:%d",arr[5]);
return 0;
}
运行结果: 1 2 3 4 5 数组占用字节数:20 arr第六个元素是:0
上例采用的是静态初始化方式,对应整型数组静态初始化时元素默认值为0,由于C语言数组并没有length属性。所以,可以使用sizeof(arr)/sizeof(int)或者sizeof(arr)/sizeof(arr[0]),方式计算数组元素个数。
例如:
#include <stdio.h>
int main() {
int arr[5]= {1};
for(int i=0; i<5; i++) {
printf("%d ",arr[i]);
}
printf("\n数组占用字节数:%d\n",sizeof(arr));
printf("\n数组的元素个数:%d\n",sizeof(arr)/sizeof(int));
//printf("\n数组的元素个数:%d\n",sizeof(arr)/sizeof(arr[0]));
//c语言不会检查数组下标越界
printf("arr第六个元素是:%d",arr[5]);
return 0;
}
运行结果: 1 2 3 4 5 数组占用字节数:20
数组的元素个数:5 arr第六个元素是:0
静态初始化有以下三种定义方式:
//直接用数字
int arr[10];
//用宏定义define
#define MAXSIZE 10
int arr[MAXSIZE];
//用const
const int size = 10 ;
int arr[size];
静态初始化时,我们也可以不指定数组长度。并且我们使用宏定义实现一个专门用来计算数组元素个数的方法LEN.
例如:
#include <stdio.h>
#define LEN(x) sizeof(x) / sizeof(x[0])
int main() {
int arr[]= {1,2,3,4,5,100};
int len = LEN(arr);
printf("%d\n",len);
for(int i=0; i<len; i++) {
printf("%d ",arr[i]);
}
printf("\n数组占用字节数:%d\n",sizeof(arr));
printf("\n数组的元素个数:%d\n",sizeof(arr)/sizeof(arr[0]));
//c语言不会检查数组下标越界
printf("arr第六个元素是:%d",arr[5]);
return 0;
}
运行结果: 6 1 2 3 4 5 100 数组占用字节数:24
数组的元素个数:6 arr第六个元素是:100
2)动态分配
使用malloc动态分配的内存在堆内存中。malloc能操作的是程序中的堆空间,而普通的数组则是存放在栈空间里面的。
例如:
#include <stdio.h>
#include <stdlib.h>
int main() {
int* arr= (int*)malloc(5 * sizeof(int));
for(int i=0; i<5; i++) {
arr[i]=i+1;
printf("%d ",arr[i]);
}
return 0;
}
运行结果: 1 2 3 4 5
注意:malloc只能用于指针变量,因此sizeof(arr))也不是arr指针变量指向的内存空间所占用的字节数量。sizeof(arr)仅仅是里面保存的内存地址类型所占用的字节数量。而sizeof(*arr)是指针变量类型所占用的字节大小。
在32位机下一个地址的大小是4个字节,所以跟int是一样的,在64位机下的话一个地址的大小应该就是8个字节就是long long类型。
例如:
#include <stdio.h>
#include <stdlib.h>
int main() {
int arr1[] = {1,2,3,4,5};
int* arr2= (int*)malloc(5 * sizeof(int));
for(int i=0; i<5; i++) {
arr2[i]=i+1;
printf("%d ",arr2[i]);
}
printf("\n----------\n");
printf("\n静态初始化的数组arr1占用字节数量:%d\n",sizeof(arr1));
printf("\n指针变量arr2占用的字节数量:%d\n",sizeof(*arr2));
printf("\n指针变量arr2指向数组第一个元素值是:%d\n",*arr2);
printf("\n指针变量arr2里保存的地址值的数据类型占用字节数量:%d\n",sizeof(arr2));
printf("\n指针变量arr2里保存的地址值是:%d\n",arr2);
return 0;
}
运行结果:
静态初始化的数组arr1占用字节数量:20
指针变量arr2占用的字节数量:4
指针变量arr2指向数组第一个元素值是:1
指针变量arr2里保存的地址值的数据类型占用字节数量:8
指针变量arr2里保存的地址值是:1577920
2.数组的遍历
通常使用for循环实现对数组遍历。 例如:从控制台输入10个整数保存到长度为10的整型数组里并遍历输出。
#include <stdio.h>
#include <stdlib.h>
#define LENTH 10
int main() {
int arr[LENTH];
for(int i=0; i<LENTH; i++) {
printf("请输入第%d个元素:",i+1);
scanf("%d",&arr[i]);
}
for(int i=0; i<LENTH; i++) {
printf("%d ",arr[i]);
}
return 0;
}
运行结果: 请输入第1个元素:12 请输入第2个元素:23 请输入第3个元素:45 请输入第4个元素:47 请输入第5个元素:9 请输入第6个元素:6 请输入第7个元素:11 请输入第8个元素:13 请输入第9个元素:18 请输入第10个元素:66 12 23 45 47 9 6 11 13 18 66