C语言——数组
C语言——数组
1.数组的概念:
1.数组是一组相同类型元素的集合
- 数组中存放的是1个或多个数据,但是数组元素不能为0。
- 数组中存放的多个数据,类型是相同的。
- 其分为一维数组和多维数组
2.一维数组的创建和初始化
数组创建:
- 基本语法如下:
type arr_name[常量值];
其中,type为数组的元素类型 ,arr_name为数组名,常量值为数组的元素个数。
例:
int math[20];//整型数组
char ch[10];//字符数组
- 数组的初始化
int arr[5]={1,2,3,4,5};//完全初始化
int arr2[6]={1};//不完全初始化
int arr[3]={1,2,3,4};//错误初始化,因为放不下
char ch1[10]="hello";//字符串的初始化,(仅此可用“”)
char ch2[10]={'h','e','l','l','o'};//字符的初始化
//数组只要初始化了,就可以省略掉数字的大小
//数组的大小会根据初始化的内容来判断
-
数组的类型
数组算是一种自定义类型,去掉数组名留下的就是数组的类型
3.一维数组的使用
- 打印数组的长度:
int arr1[10];//10*4=40
printf("%zd\n",sizeof(arr1));//结果是40,计算的是整个数组的大小,单位是字节
- 数组下标
1.C语言规定数组是有下标的,下表是从0开始的,假设数组有n个元素,最后一个元素的下标是n-1,下标就相当于数组元素的编号,如下:
int arr[10]={1,2,3,4,5,6,7,8,9,10};
其对应的下标就为:[ ]为下标引用操作符
- 数组的输入(输出同理)
int main(){int arr[8]={0};int i=0;for(i=0;i<7;i++){scanf("%d",&arr[i]);}return 0;
}
- 数组的地址(数组的元素在内存中是连续存放的)
int arr[8]={0};
int i=0;
for(i=0;i<8;i++){
printf("&arr[%d]=%p\n",i,&arr[i]);
}
结果:
解释:×64:配置成64位环境,编译出来的是64位程序,只能在64位环境中运行;×86:配置成32位环境,编译出来的是32位的程序,32位,64位环境中都能运行。
- sizeof计算数组的元素个数
int arr[20]={0};
int i=0;
printf("%zd\n",sizeof(arr)/sizeof(arr[0]));//计算一个元素的长度
4.二维数组的创建和初始化
- 概念:数组的元素都是内置类型的,如果把一维数组作为数组的元素,这时候就是二维数组。多维数组同理
- 二维数组的创建:语法如下
type arr_name[常量值1][常量值2];
例如:
int arr[3][5];//3表示数组有三行,5表示每一行有5个元素
double date[2][8];
- 二维数组的初始化(行可省,列不可省)
int arr1[3][5]={1,2};//不完全初始化
int arr2[3][5]={0};
int arr3[3][5]={1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7}//完全初始化
int arr4[3][5]={{1,2},{3,4},{5,6}}//分别放到每一行,剩下的自动补0
- 二维数组的元素输入和输出
//输入:(输出同理)
int i=0;
for(i=0;i<3;i++){int j=0;for(j=0;j<5;j++){scanf("%d",&arr[i][j]);}}
二维数组在内存中也是连续存放的
5.C99中的变长数组
- 引入:在C99标准之前,C语言在创建数组的时候,数组大小的指定只能使用常量,常量表达式,或者如果我们初始化数据的话,可以省略数组的大小,这样的语法限制让数组不够灵活,有时候数组大了浪费空间,有时候数组小了不够用,因而引入C99中给的一个变长数组 的新特性,允许我们可以使用变量指定数组的大小,变长数组不能初始化,运行时才能知道大小。
- 使用:VS2022默认使用的msvc编译器,不支持C99中的变长数组,解决方法:gcc和苹果的clang编译器支持,而vs2022中可以使用clang。
int main()
{int n=0;scanf("%d",&n);int arr[n];//切记变长数组不能初始化int i=0;for(i=0;i<n;i++){arr[i]=i;}for(i=0;i<n;i++){printf("%d",arr[i]);}
允许程序运行时指定大小,变长数组一旦确定大小后就不能在改变了。