1.一维数组
在介绍一维数组之前,先来了解下什么是数组。数组,英文名为array,简写为arr(一般在C语言中用arr来指代数组)可以理解为数学中的集合。是具有相同特征元素的集合。比如,一群打篮球的人,你就可以创建一个数组,数组的元素就是打篮球的人的名字。
- 一维数组的定义
定义方式:类型 int float double char .......
数组名 arr1,arr2,......
[常量表达式] 只能为常量不能为变量
int arr[10];定义了10个整型变量,将其存储到arr这个数组中。(相比于一个一个创建,效率提升)
常见错误举例:
//#define _CRT_SECURE_NO_WARNINGS 1 //常见错误 //1.[]中存入变量 //int n; //scanf("%d", n); //int arr[n];//[]中只能为常量 //若提前调用函数,则n会根据函数的值来 //void func(int n) //{ // int arr[2 * n];//在每次调用func函数时,都会得到不同的数组长度,成这样的数组为可变长数组,但在执行函数后n不变。 // //}
- 一维数组的初始化
初始化就是给数组赋值 ,初始化的方式多样,下面介绍常见初始化方式;
1.给所有元素赋值
int arr1[5]={12345};5个元素全部初始化
2.部分元素赋值
若部分元素赋值,则其余部分默认为0(整形数组),若为字符型数组,则默认为\0;若为指针型数组,默认为NULL,即空指针;
int arr2[5]= {1,2,3};则其余两个元素默认为0;
3.若数据个数确定,则可以不用添加长度(常用于字符型数组)
int arr3[]= {1,2,3,4,5}; char ch [] = {"i love c"};char ch [] = "i love c";
- 一维数组的引用
引用,是通过下标(subscript)完成;C语言中,默认第一个元素的下标为0;即,若一个数组的长度为n,则其下标的最大值为n-1;
注意:引用时下标不要超过最大值,否则有溢出危险
int arr[5] = { 1,2,3,4,5 };//定义了一个长度为5的数组
printf("%d\n", arr[0]);//分别打印出数组中的元素
printf("%d\n", arr[1]);
printf("%d\n", arr[2]);
printf("%d\n", arr[3]);
printf("%d\n", arr[4]);
printf("%d\n", arr[5]);//这是个错误的代码,数组长度为5,则下标最大值为4;
一维数组程序举
#include <stdio.h>//输出斐波那契数列前25个数字(要求每行输出5个) int main() { int i; int arr[20];//定义一个长度为20的数组,用于存放20个数字; arr[0] = 1; arr[1] = 1; for (i = 2; i < 20; i++) { arr[i] = arr[i - 1] + arr[i - 2];//根据数列性质,利用for循环实现将前20个数字存储到数组中 } for (i = 0; i < 20; i++) { if (i % 5 == 0)//实现5个数一换行 printf("\n"); printf("%10d", arr[i]); } return 0; }
冒泡排序法 (核心:for循环的嵌套)
#define _CRT_SECURE_NO_WARNINGS 1 //练习冒泡排序法(输入五个数字,实现升序排列) //冒泡排序法就是两两比较,将较大的数字通过比较移动到后面,实现升序或降序处理 #include<stdio.h> int main() { int i,j,t; int arr[5]; printf("请输入五个数字"); for (i = 0; i<5; i++) { scanf("%d", &arr[i]);//将5个数字存储到数组中 } printf("\n"); for (j = 0; j < 4; j++)//冒泡排序法的核心:for循环的嵌套;//一共5个数字,第一趟比较需要4次,第二趟比较需要3次,以此类推; { for (i = 0; i<4-j; i++) { if(arr[i]>arr[i+1])//接下来进行比较 { t = arr[i + 1]; arr[i + 1] = arr[i]; arr[i] = t;//交换前后两个数字顺序 } } } printf("升序处理的数字为:\n"); for (i = 0; i < 5; i++) { printf("%d ", arr[i]); } return 0; }
2.二维数组
二维数组通常称为矩阵(matrix),写成row(行)和column(列)的形式。
- 二维数组的定义:
类型 数组名称 [常量表达式] [常量表达式]
行(row) 列(column)
float arr [3][4];相当于创建了一个3*4的矩阵int arr[10][10];
- 二维数组的初始化
1.各个元素都赋值
#include <stdio.h> int main() { int arr[2][2] = { {1,2},{3,4} };//全体元素都赋值 int i, j; for (i = 0; i < 2; i++) { for (j = 0; j < 2; j++) { if (j% 2 == 0) printf("\n"); printf("%5d", arr[i][j]); } } return 0; }
2.部分赋值
int arr [3][4]={{1,2},{3,4}}//其余元素为0;
3.在赋值时行数可不做要求,系统会根据列数自动分配;
int arr[][3]={1,2,3,4,5,6};很明显是两行三列(尽量不要这么写,不是好的代码风格)
3.二维数组的引用
同一维数组,注意不要超过下标的最大值即可;
4.二维数组程序练习
//转置数组的练习 int main() { int arr1 [2] [3] = { {1,2,3},{4,5,6} }; int arr2[3][2]; int i, j; printf("arr1:\n"); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) { if (j % 3 == 0) printf("\n"); printf("%7d", arr1[i][j]); arr2[j][i] = arr1[i][j]; } } printf("\n"); printf("arr2(转置后):\n"); for (i = 0; i < 3; i++) { for (j = 0; j < 2; j++) { if (j % 2 == 0) printf("\n"); printf("%7d", arr2[i][j]); } } return 0; }
//利用擂台算法来找出数组中最大值,并给出其row,column; int main() { int arr[4][5] = { {12,23,31,26,11},{10,11,56,67,79} ,{64,65,98,90,35 },{10,20,30,40,50} }; int i, j,row,column; int max; max = arr[0][0];//定义一个最大值,并使数组第一个元素为擂主 for (i = 0; i < 4; i++) { for (j = 0; j < 5; j++) { if (arr[i][j] > max) { max = arr[i][j]; row = i; column = j; } } } printf("max=%d\nrow=%d\ncolumn=%d\n" ,max,row,column); return 0; }
3.字符数组
字符数组,即用来存放字符的的数组。要注意,C语言中并没有字符串类型,字符串类型是以字符数组的形式出现。
1.字符数组的定义 类似于数值型数组定义方式,类型 数组名称 [常量表达式] char ch[]; char[][];二维数组 注意:我们知道,字符型数据的存储是通过ascii值存放的,所以字符型数据可以看作整形数据的一部分,即一下定义方式也合法;
int ch [10]; ch[0]=1;//但是这种定义方式占用空间,因为int类型占4个字节,char类型占一个字节
2.字符数组的初始化
//对每个元素都赋值 char ch [4]={'l','o','v','e'}; //若字符长度确定,可以不指明长度.更加方便便捷 char ch []={'l','o','v','e'}; //若初始值小于指定长度,则系统自动补充\0;即空操作符; char ch[5]={'l','o','v','e'}; char ch[3][3]={{' ','*',' '},{'*',' ','*'},{' ','*',' '}} //注意单引号之内不能什么也没有,你可以添加空格 //也可以一次性输入,用''''括起来 char ch ={"i love you"};
3.字符数组的引用
方法和数值型数组相同,通过下标来引用;
4.字符串的结束标志
字符串的结束标志为\0,在ascii码值中对应空操作符;
printf("love\0you"); //字符串的结束标志为\0,这个程序的只会输出love; //一般情况下,系统会自动在字符串末尾添加\0,作为结束标志;
5.字符数组的输入与输出
1.逐个字符输出,char ch [4]={'h','e','h','e'};printf("%c",ch[i]);
若想从e输出,则:printf("%s",&a[1]);
2.以字符串输出 char ch ="hehe";printf("%s",ch);注意:输出字符串时类型为string,即%s;同时,输出时要用数组名,因为你要一下子输出所有元素,而不是单个元素输出;逻辑为,先找到数组ch的起始地址,逐个字符输出,直到遇到\0;
3.字符串的输入scanf("%s",ch);注意:这个地方不用&,因为数组一旦创建就有一个起始地址,自动存到内存中了;
补充:
//用for循环实现读取字符串结束标志 for(i=0;arr[i]!=\0;i++); //实现从字符串中提取数字 if('0'<=arr[i] && '9'>=arr[i]);
4.字符串的处理函数
//以下函数在引用时要添加#include <string.h> //1.puts函数 字符串输出函数 puts(str);//注意puts输出的一定是以\0结尾的字符串;若不是,令arr[i]='\0' //注意和putchar函数的区别,putchar只能输出单个字符; //2.fgets函数 字符串输入函数 fgets(str,sizeof(str),stdin);输入时不会读取\0; //函数对str作用后会得到他的初始地址; //3.strlen函数 字符串长度计算函数 strlen(str);//他计算的是实际长度,且不包括\0; char arr [10]={"i am you"} strlen(arr)=6; //4.strcmp函数 字符串比较函数 strcmp(str1,str2); //strcmp(str1,str2)>0;str1在str2后面; //strcmp(str1,str2)<0;str1在str2前面; //strcmp(str1,str2)=0;str1和str2完全相同; //后面的单词更大,且小写比大写大; //5.strcat函数 字符串连接函数 strcat(str1,str2);//把str2连接到str1之后; //一定要注意str1的长度是否足够大 //6.strcpy函数 字符串复制函数 strncpy函数 可以限制长度复制字符串 strcpy(str1,str2);将str2的字符串赋值给str1; strcpy(str1,"china"); strncpy(str1,str2,2);//将str2的字符串前两个字符赋给str1; strncpy(str1,"china",2);//将ch两个字符赋给str1; //7.strupr函数 字符串变大写函数 strlwr函数 字符串变小写函数; strupr(str); strupr("china")=CHINA;
5.总结
数组概念是C语言学习中重要的一个概念,他解释了在C语言中如何表示字符串,即通过字符数组;一维数组,二维数组也很重要,他们为我们提供了一个简单的创建大量变量的方法,要充分理解数组的作用,即定义一个数组后,会自动产生一个初始地址;要理解二维数组的概念,可以用线性代数中的矩阵概念来理解,要认识到二维数组其实可以看为特殊的一维数组(和分块矩阵的概念类似);字符数组也很重要,告诉我们如何实现字符串的输出与输入;在数组中,我们还学习了两个重要的排序方法,一是冒泡排序法(核心为for循环的嵌套),二是擂台法,希望大家能够勤加练习,谢谢观看!