数组基本定义
数组可以用来存储一组有序的数据。数组是一块连续的、大小固定并且里面的数据类型一直的内存空间。
1、 声明数组一般式:
数据类型 数组名称[长度];
int grades[20]; //声明一个能够存储20个int类型数据的数组。
2、 初始化数组:
1、数据类型 数组名称[长度n] = {元素1,元素2...元素n};//也可以只初始化一部分值 数据类型 数组名称[长度n] = {元素1,元素2};其余元素初始化为0
int grades[3] = {1,2,3}; // int grades[3] = {1};
2、数据类型 数组名称[] = {元素1,元素2...元素n};
int grades[] = {1,2,3};
3、数据类型 数组名称[长度n] ;数组名称[0]=元素1;数组名称[1]=元素2;数组名称[n-1]=元素n;
int grades[3] ;
grades[0]=1;grades[1]=2;grades[2]=3;
数组在初始化的时候,数组内元素个数不能大于声明数组的长度。
3、 数组取值
数组是一组有序的数据结构,所以通过下标来取对应的值。
数组名称[元素对应下标]
1、数组下标从0开始,最后一个元素下标是数组长度n-1。即x号元素对应的是第(x+1)个元素。
C语言中数组长度一旦声明,长度就是固定无法改变
4、 数组遍历
数组遍历就是采用循环的方式将数组中的每个元素遍历出来。前面集中循环的方式都可以用来遍历,但有点注意的地方:避免数组越界访问,即循环变量不要超出数组长度。
C语言中的数组长度声明之后是固定的,并且C语言中没有计算数组长度的方法。
int arra[10] = {1,4,4,6,7,8,9,12};
for (int i = 0; i < 10; i ++) {
printf("%d\n",arra[i]);
}
5、数组排序-冒泡排序
升序排序为例:相邻元素两两比较,将较大的数字放在后面,直到将所有数字全部排序。
int grades[10] = {89,45,67,67,45,43,78,90,50,20};
for (int i = 0; i < 10; i ++) {
printf("%d ",grades[i]);
}
for (int i = 0; i < 9; i ++) {
for (int j = i; j >= 0; j --) {
if (grades[j] > grades[j+1]) {
int temp = grades[j];
grades[j] = grades[j+1];
grades[j + 1] = temp;
}
}
}
printf("\n ---- 排序 ------\n");
for (int i = 0; i < 10; i ++) {
printf("%d ",grades[i]);
}
printf("\n");
打印结果:
89 45 67 67 45 43 78 90 50 20
---- 排序 ------
20 43 45 45 50 67 67 78 89 90
另外一种写法(原理一样):
// for (int i = 8; i >= 0; i --) {
// for (int j = 0; j <= i; j ++) {
// if (grades[j] > grades[j+1]) {
// int temp = grades[j];
// grades[j] = grades[j+1];
// grades[j+1] = temp;
// }
// }
// }
多维数组
- 一般定义式:
数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n];
- 初始化方法:
1、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n] = {{值1,...值n},{值1,...值n}...{值1,...值n},}; //必须制定列的维数,因为心痛会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数
2、数据类型 数组名称[常量表达式1][常量表达式2]...[常量表达式n];
数组名称[下标1][下标2]..[下标n] = 值;
//必须同时指定行和列的维数。
- 取值
与一维数组一样通过下标取值,多为数组需要通过多个维度的下标值确定取值位置。
int arr[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9}};
int index = arr[0][0];
同样每个维度上都不能越界。
- 遍历
通过嵌套循环实现多维数组的遍历。
多维数组的每一维下标决不能越界。
int arr[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9}};
int i,j;
int sum=0;
for(i=0;i<3;i++)
{
for (j = 0; j<3; j++) {
if (i == j || i == 2-j) {
printf("%d\n",arr[i][j]);
}
}
}
字符串数组
字符串是由多个字符组合而成的一段话,C语言里没有办法直接定义字符串数据类型,不过可以用数组来定义我们所要的字符串。
一般形式
1、char 字符串名称[长度] = "字符串值";
char name[] = "我是张三jun";
2、char 字符串名称[长度] = {'字符1','字符2',...'字符n','\0'}; //必须以'\0'结束,'\0'表示字符串的结束标志,这种方式在数组中不能写中文
char name[] = {'w','o',' ','s','h','i',' ','A','\0'};
[]中的长度可以省略。
字符串函数
-
strlen(s)
计算字符串长度,只是计算字符串长度,不能计算其他类型数组长度
printf("%ld",strlen("sss")); //3
printf("%ld \n",strlen("语言"));//6
-
strcmp(s1,s2)
比较字符串,比较字符串的ASCII码值,返回结果:0-相等,1-s1>s2,-1-s1
char s1[] = "abc";
char s2[] = "acb";
printf("%d",strcmp(s1,s2)); //-1
printf("%d",strcmp(s2,s1)); //1
printf("%d",strcmp(s1,s1)); //0
-
strcpy(s1,s2)
字符串拷贝,拷贝后覆盖原来字符串且不能对字符串常量进行拷贝
char s1[10] = "学习 ";
char s2[] = "C语言";
strcpy(s1,s2);
printf("%s",s1);//C语言
-
strcat(s1,s2)
把字符串s2拼接到s1后,s1与s2内存空间不能重叠,且s1要有足够的空间来容纳要复制的字符串。
char s1[10] = "学习 ";
char s2[] = "C语言";
strcat(s1,s2);
printf("%s\n",s1); //学习 C语言
-
atoi(s1)
字符串转换为整数
printf("%d\n",atoi("100")); //100
printf("%d\n",atoi("aaa")); //0