1. 数组
(1)特点:同一数组中的所有元素都属于同一种数据类型,比如 int 型、float 型、double 型和 char 型。
(2)方法:一个数组元素其实就是一个变量,也可以称带下标的变量。
(3)数组分类:一维数组、二位数组或字符数组等。
2. 一维数组
(1)定义格式:类型名 数组名[常量表达式];
// 一维数组,注意,中括号内的常量表达式必须是整数
int num[10] ; //一维整型数组
float stu[10] ; //一维单精度浮点型
double tec[10] ; //一维双精度浮点型
char str[10] ; //一维字符型数组
(2)特点:只有一个下标,先定义数组后使用数组,不能整体使用数组名。
(3)定义一维数组的几个注意事项:
- 数组名属于用户自定义标识符,需要按照标识符的定义规则进行定义,如 int for[10]; 不合法,因为 for 是关键字。
- 定义一维数组时数组名后必须用一个方括号 “[]” 将其常量表达式括起,常量表达式的值表示所定义数组共有多少个元素(数组长度或数组的大小)
- 定义数组时方括号 “[]” 里的常量表达式不含有变量,且常量表达式的值必须是正整数,如 int a[0]; 不合法,0 不是正整数,int n=9; 和 int a[n] 都不合法,而 int num[10]; 合法。
- C 语言中每个数组在内存中分配空间时是连续分配的。
(4)定义一维数组
- 将元素的初值依次放在一对中括号 “{}” 中赋值给数组(必须使用中括号 “{}” 将初值括起,且用逗号分隔)。例如:int num[5] = {117,818,520,99}; ,中括号中的数字少则自动补 0 ,多则出错。
- 定义赋初值的个数等于数组长度时,数组长度可以省略,如 int a[ ] = {23,24,25,27,29}; 。
- 如果定义一个一维数组但并未给其赋予初值,则该数组中的数值就是随机值,比如 int stu[10]; ,一维整型数组中的 10 个数据为系统任意分配的随机值。
- 只能在定义数组时的同时用中括号 “{}” 给数组元素整体进行赋值,其他请款基本上个单个数组元素进行赋值。
注意:在定义一维数组时,数组元素下标是从 0 开始的,数据元素的赋值也是从 0 下标开始进行赋值。例如一维整型数组 int num[5] = {10,11,12,13,14},其中: num[0]=10,num[1]=11,num[2]=12,num[3]=13,num[4]=14。注意数组元素中的下标不能超过或等于 5 ,比如 num[5] 则不合法。
3. 二维数组
(1)定义格式:类型名 数组名[常量表达式1/行数][常量表达式2/列数]; ,如 int num[2][3]; 。
(2)引用:数组名 [行下标][列下标];
(3)二维数组初始化
- 将初值依序放在一对中括号 “{}” 中,与一维数组初始化格式相同,例如 int a[2][3] = {1,2,3,4,5,6};,其中 a[0][0] = 1,a[0][1] = 2,a[0][2] = 3,a[1][0] = 4,a[1][1] = 5,a[1][2] = 6。
- 按行初始化每一行均用一对中括号 “{}” 括起,采用嵌套的格式,例如 int a[2][3] = {{1,2,3},{4,5,6}};
(4)定义二维数组注意事项
- 在进行二维数组初始化时,行数可以省略,但列数不可以省
- int a[2][3] = {1,2,3,4,5,6} ; ,合法
- int a[2][ ] = {1,2,3,4,5,6} ; ,不合法
- int a[ ][3] = {1,2,3,4,5,6} ; , 合法
注意:二维数组初始化过程和一维数组初始化过程类似,二维数组在初始化过程中,如果二维数组初始化所赋值的数字个数小于二维数组的实际个数,初始化过程中所差数字个数用 0 代替。
4. 字符数组(存放字符,而非字符串)
(1)C 语言中无字符串变量,采用字符数组来存放字符串或者字符型指针变量来存放字符串。
(2)字符数组的初始化:char s[5] = {‘a’,‘b’,‘c’,‘d’,‘e’};,与其他类型数组初始化一样,只是初值为字符。
(3)字符串:字符串的结束标志是其字符串末尾的 ‘\0’,在存放字符串时,在字符数组末尾存放字符串结束符 ‘\0’。例如 char str[5] = “abcd”,由五个字符组成,占用五个存储单元,分别是 ‘a’,‘b’,‘c’,‘d’,’\0’。需要注意的是:”“ 等价于 ‘\0’,为空字符串。
(4)用字符串给一维字符数组进行初始化的几种情况:
- char s[5] = “abcd” ;等同于 char s[5] ={‘a’,‘b’,‘c’,‘d’};
- char s[5] = “abcd” ;等同于 char s[5] = {“abcd”};
- char s[5] = “abcd” ;等同于 char s[5] ={‘a’,‘b’,‘c’,‘d’,’\0’};
5. 字符串的使用
(1)字符串的 scanf 输入:利用 scanf 函数由键盘输入,例如 char s[10]; scanf("%s",s);
注意:用 %s 格式输入字符串时,遇到空格符或回车符则自动结束输入,多个 %s 出现时,不能出现逗号或者空格进行分隔,不然会将其逗号或者空格视为有效的字符。
(2)字符串的 printf 输出:利用 printf 函数输出字符串。
scanf("%s",s); //输入:ab(空格)cd(回车)
printf("%s",s); //输出:ab 注意:输出时则从首地址开始直到遇到 \0 后结束输出。
(3) 字符串的 gets 输入:gets(字符数组);
- 读取一个字符串赋值给字符数组,用 gets() 输入字符时,只有遇到回车符才结束读取(输入)字符。
char str[10];
gets(str); //输入 abcd(空格)cd(回车)
// 输出的 str:abcd(空格)cd
- 输入过程,不管是用 %s 或是 gets() 都无需输入双引号,否则会被当作字符串的有效字符。
(4)字符串的 puts 输出:puts(字符数组或字符串常量)
- 在编译器屏幕上输出字符数组中的字符。
char str[10];
gets(str); //输入:abcdefs
puts(str); // 输出:abcdefs
注意:用 puts 函数与用 printf 函数输出 %s 格式输出一样, 只是该函数将 ‘\0’ 转化成 '\n‘。例如:puts(“abc”); puts(“efg”); 输出结果为 abc(换行)efg。
6. 字符串常见函数
(1)strcat 函数:字符串连接函数
// 格式:strcat(字符数组1,字符数组2);
char a[5] = "abcd" ;
char b[3] = "fg" ;
char s[7] ;
s = strcat(a,b); //从 a 字符数组的第一个 '\0' 开始连接.b 字符数组的 '\0'也接入,并返回首地址 s[0]。
puts(s); //输出:abcdfg
(2)strcpy 函数:字符串复制函数
// 格式:strcpy(字符数组1,字符数组2);
char str1[8] = "hello" ;
char str2[10] = "helloxm" ;
str = strcpy(str1,str2); //将 str2 中所有字符全部复制给 str1
puts(str1); //输出 str1:helloxm
puts(str2); //输出 str2:helloxm
(3)strcmp 函数:字符串比较函数
注意:strcmp 函数是比较两个字符串的函数返回值相同位置不同字符的ASCII 码的差值,注意不能使用关系运算符直接进行两个字符串大小或字符数组大小的比较。
// 格式:strcmp(字符数组1,字符数组2);
char s1 = "abc" ;
char s2 = "abc" ;
int cz1 ;
cz1 = strcmp(s1,s2); // 输出 cz1 : 0 ,因为两个字符串完全相同,故两个字符串的 ASCII 码差值为 0 。
char s3 = "abc" ;
char s4 = "abe" ;
int cz2 ;
cz2 = strcmp(s3,s4); //输出 cz2 :2 ,两个字符串前两位相同,第三位不同,而 c 的 ASCII 码为 97 , e 的 ASCII 码为 99,故两个字符串的差值为 2
(4)strlen 函数:求字符串的实际长度
// 格式:strlen(字符数组);
//第一种情况
char s[10] = "asnsms" ;
printf("%d",strlen(s)); //输出字符串 s 的实际长度 :7
//第二种情况
char a[] = "abc\018\0" ;
printf("%d",strlen(a)); //输出字符串 a 的实际长度 :5,字符分别是:a,b,c,\01,8
//第三种情况
char b[] = "abc\017\0" ;
printf("%d",strlen(b)); //输出字符串 b 的实际长度 :4 ,字符分别是:a,b,c,\017
//第四种情况
char c[] = "abc\08\0" ;
printf("%d",strlen(c)); //输出字符串 c 的实际长度 :3 ,字符分别是:a,b,c