Loading... 数组 ==== 在C语言里,数组(Array)可以表示一组数据 例如,数组是构造数据类型之一 数组: 有序数据的集合,用数组名标识 元素: 属同一数据类型,用数组名和下标确定 ## 一维数组 ### 一维数组的定义 ##### 定义方式: ![输入图片说明](/images/Cimages/array-master//1.png) > 例: int a[6] ![输入图片说明](/images/Cimages/array-master/2.png) ### 一维数组的引用 1、数组必须先定义,后使用。 2、只能逐个引用数组元素,不能一次引用整个数组。 3、数组元素表示形式: 数组名[下标] ,下标可以是常量或整型表达式。 4、调用数组元素的 **三种** 方法: **下标法** 、 **数组名法** 、 **指针法** ##### 引用方式: ```c #include<stdio.h> int main() { int a[] = { 1,2,3,4,5 }, i, * p; printf("用下标引用数组元素:\n"); for (i = 0; i < 5; i++) printf("%d\n", a[i]); printf("用数组名引用数组元素:\n"); for (i = 0; i < 5; i++) printf("%d\n", * (a+i)); printf("用指针引用数组元素:\n"); for (p = a; p < a+5; p++) printf("%d\n", * p); return 0; } ``` ### 一维数组的初始化 ##### 初始化方式: ![输入图片说明](/images/Cimages/array-master/3.png) **说明:** > 1、数组不初始化,其元素值为随机数。 > 2、对static数组元素不赋初值,系统会自动赋以0值。 ![输入图片说明](/images/Cimages/array-master/4.png) > 3、只给部分数组元素赋初值。 ![输入图片说明](/images/Cimages/array-master/5.png) > 4、当全部数组元素赋初值时,可不指定数组长度。 ![输入图片说明](/images/Cimages/array-master/6.png) ##### 程序举例 > 例1: 读10个整数存入数组,找出其中最大值和最小值 ![输入图片说明](/images/Cimages/array-master/7.png) ```c /*示例1*/ #include <stdio.h> #define SIZE 10 main() { int x[SIZE],i,max,min; printf("Enter 10 integers:\n"); for(i=0;i<SIZE;i++) { printf("%d:",i+1); scanf("%d",&x[i]); } max=min=x[0]; for(i=1;i<SIZE;i++) { if(max<x[i]) max=x[i]; if(min>x[i]) min=x[i]; } printf("Maximum value is %d\n",max); printf("Minimum value is %d\n",min); } ``` ## 二维数组及多维数组 ### 二维数组的定义 ##### 1.定义方式 : ![输入图片说明](/images/Cimages/array-master/8.png) 将二维数组视为一个矩阵,下图显示了数组中每个元素在矩阵中的存放位置。 ![输入图片说明](/images/Cimages/array-master/9.png) ##### 2.数组元素的存放顺序 1.原因: 内存是一维的 2.二维数组: 在C语言中,二维数组中元素排列的顺序是**按行存放**的,就是说先排列第一行的数据,再排列下第二行的数据,以此类推。如图: ![输入图片说明](/images/Cimages/array-master/10.png) ##### 3. 二维数组的初始化 对二维数组的初始化有一下几种办法: > **(1)分行给二维数组赋值** 这个方法用到了我们前面讲的对二维数组的**降维理解**,比如: ```c int a [2] [3] = {{1, 2, 3}, {4, 5, 6}}; ``` 此语句先将第一行元素依次赋值为:1、2、3,然后将第二行元素赋值为:4、5、6,因此说是按行赋值。 > **(2) 可以只有一个花括号,按二维数组元素的排列顺序对各元素依次赋值** 比如: ```c int a [2] [3] = {1, 2, 3, 4, 5, 6}; ``` > **(3)对部分元素赋初值** ```c int a [2] [3] = {{2}, {4}}; ``` 此语句表示只给第一行第一个元素赋值为2,第二行第一个元素赋值为4,而其他元素都为0。 ```c int a [2] [3] = {{1, 2, 3}}; ``` 此语句表示只给第一行三个元素分别赋值为:1、2、3。 ```c int a [2] [3] = {{},{1, 2, 3}}; ``` 此语句表示只给第二行三个元素分别赋值为:1、2、3。 > (**4)定义数组时对第一维的长度可以不定义,但必须定义第二维的长度** ```c int a [] [3] = {1, 2, 3, 4, 5, 6}; ``` 系统会根据输入的总个数分配存储空间,易知这个二维数组有二行; 再如: ![输入图片说明](/images/Cimages/array-master/11.png) ## 字符数组 ### 字符数组的定义 **定义 :** 每个元素存一个字符,主要用来对字符串操作。 > 这是定义了一个长度为 80 的一维字符数组。 ```c char line [80]; ``` > 这是定义了一个 2 行 3 列的二维字符数组。 ```c printf ("%c", line [2]); ``` ### **字符数组的初始化:** **1、逐个字符赋值** **2、用字符串常量** #### 字符的初始化方法可以分为两种: > (1) 将字符逐个赋给数组中的每个元素; ```c char c [5] = {'c', 'h', 'i', 'n', 'a'}; ``` 这是把5个字符分别赋给 c [0] ~ c [4] 这 5 个元素中。 > (2) 直接用字符串常量给数组赋初值。 ```c char c [6] = "china"; ``` **为什么使用只有5个字符前面写着 6 。** > 当括号里面写成 5 时,程序就会被报错!如图: ![输入图片说明](/images/Cimages/array-master/12.png) > 当括号里面写成 6 时,程序就会正常!如图: ![输入图片说明](/images/Cimages/array-master/13.png) 无论用以上哪种方法进行初始化,如果提供的字符个数大于数组长度,系统就会进行语法错误处理,比如上面的情况;如果提供的字符个数小于数组长度,则只会给前面几个元素赋值,剩下的自动设置为0,即 ’\0‘。 > 例: ```c char a [10] = {'c', 'h', 'i', 'n', 'a'}; ``` > 这里定义了10个长度,但只给 5 个元素赋值,那么这个数组的状态就会是: | c | h | i | n | a | \0 | \0 | \0 | \0 | \0 | | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- | C语言约定用**'\0'**作为***字符串的结束标志***,***它占内存空间***。这里的"china"的有效长度为 5 ,但实际上还有第 6 个字符'\0'。 也就是说,当遇到'\0'时,表示字符串结束,由它前面的字符组成字符串。 在程序中,常用'\0'来判断字符串是否结束,因此所定义的字符数组长度应该大于字符串的实际长度,这样才足以存放相应的字符串,这就是前面为什么写 6 而不是 5 的原因 **注意:**'\0'是代表ASCII码值为 0 的字符,是一个不可显示的字符,表示一个“空字符”,也就是说它什么也没有,只是一个可供识别的标志。 ### 字符数组的输入和输出 #### 赋值语句 注意,**赋值 ≠ 初始化!** 和整型数组等一样,字符数组是不能用赋值语句整体赋值,如下代码是**错误的**!!! ```c char str [12]; str [12] = "the string"; ✘ ``` 对于一般数组而言,输入和输出的时候只能对数组元素一个一个进行; 而对于字符数组它**不仅可以逐个输入输出,还可以整体输入输出** ##### 1.逐个字符输入/输出 > ① 使用 `scanf` 进行输入,使用 `printf` 进行输出,这个时候,要使用格式符 “`%c`”; ```c for (i = 0; i < 10; i++) scanf ("%c", &str [i]); //逐个输入 for (i = 0; i < 10; i++) printf ("%c", str [i]); //逐个输出 ``` > ②使用 `getchar()` 和 `putchar()` 函数。 ```c for (i = 0; i < 10; i++) str [i] = getchar (); //逐个输入 for (i = 0; i < 10; i++) putchar (str [i]); //逐个输出 ``` ##### 2.字符串整体输入输出 > ①使用 `scanf` 进行输入,使用 `printf` 进行输出,这个时候,要使用格式符 “`%s`”; ```c char str [6]; scanf ("%s", str) //整体输入 printf ("%s", str) //整体输出 ``` 注意:`scanf` 中的 str 代表 str 这个字符数组的首地址,因此不加“`&`”!输入时系统会自动在字符串结尾加上结束符 '\0'。也可以同时输入多个字符串,这个时候输入的时候要用**空格**或者**回车符号**分隔开。 ![输入图片说明](/images/Cimages/array-master/14.png) > ② 用字符串处理函数 `gets()` 进行字符串整串的输入,`puts()` 进行字符串整串的输出 ##### 3.总结: (1)输出字符不包括'\0'; (2)用格式符"%s"时,输出项应该是**数组名**,不是数组元素; (3)当数组长度大于字符串实际长度时,也只能输出到'\0'结束; (4)如果数组中包含一个以上的’\0‘时,遇到第一个’\0‘时结束输出,比如: ![输入图片说明](/images/Cimages/array-master/15.png) ### 字符串函数 C语言有一批字符串处理函数,其中 `gets()` 和 `puts()` 函数包含在头文件`<stdio.h>`中,其余的包含在`<string.h>`中。 ##### 常用的 8 个字符串函数: ###### 1.`gets()`整行输入函数 > 一般形式:gets(字符数组),例如: ```c gets (str); ``` 执行这个语句时,**gets**函数从键盘读入一串字符,直至遇到**换行符’\n‘**为止; 字符串输入后,系统会自动用'\0'置于字符串的尾部,以替代换行符。 ###### 2.`puts()`整行输出函数 > 一般形式:puts(字符数组),例如: ```c char str [] = "string"; puts (str); ``` 这个函数的作用是将字符串中的内容显示在屏幕上,直到遇到第一个字符串结束符'\0'时。停止输出并自动换行。 > 用puts函数输出的字符串中可以出现转义字符,用于实现某种格式的控制。例如: ![输入图片说明](/images/Cimages/array-master/16.png) ###### 3.`strlen()`字符串长度函数 > 一般形式:`strlen(字符数组)`,例如: ```c char str[]="string"; strlen (str); strlen ("string"); ``` 该函数用于统计字符串开始到’\0‘的有效长度。 ###### 4.`strcat()`字符串连接函数 一般形式:`strcat(字符数组1, 字符数组2)`,例如: ```c char str1 [15]= "I am "; char str2 [] = “student”; strcat (str1, atr2); ``` 这个函数的作用是将字符数组 2 连接在字符数组 1 上,就像嫁接一样。 > 连接前后的情况如下: | | 连接前 | 连接后 | | ---- | --------------------------- | ------------------ | | str1 | `I am \0\0\0\0\0\0\0\0\0\0` | I am student\0\0\0 | | str2 | student\0 | student\0 | 注意:字符数组1的长度要足够大 ###### 5.`strcpy()`字符串复制函数 一般形式:`strcpy(字符数组1, 字符数组2)`,例如: ```c char str[10]; strcpy (str, "china"); ``` **注意:** 在向字符数组1中复制(或者“赋值”)时,**字符数组2中的结束标志'\0'也被复制过去了**,比如: | | 复制前 | 复制后 | | ---- | --------- | ---------- | | str1 | abcdefg\0 | &&&\0efg\0 | | srr2 | &&&\0 | &&&\0 | 复制后的str1中出现了两个'\0',则用 "`printf("%s", str1)`" 和 “`puts(str1)`” 输出时,只会输出“`&&&`”。 ###### 6.`strcmp()`字符串比较函数 一般形式:`strcmp(字符数组1, 字符数组2)` **规则:** 对两个字符串自左向右逐个字符进行比较——按**ASCII码值**大小比较,直到出现不同字符或者遇到'\0'为止。 **注意:**这里比较是**ASCII码值!** 如果全部字符**都相同**,则认为**相等**; 若出现不同的字符,则以**第一个**不同的字符的比较结果为准; ● 如果字符串1 = 字符串2,函数值为 0; ● 如果字符串1 > 字符串2,函数值为一正数; ● 如果字符串1 < 字符串2,函数值为 一负数; ###### 7.`strlwr()`字符串中的大写字母换成小写字母函数 > strlwr中的“lwr”是lowercase(小写)的缩写,运用很简单,如图: ![输入图片说明](/images/Cimages/array-master/17.png) ###### 8.`strupr()`字符串中的大写字母换成小写字母函数 strupr中的“upr”是uppercase(大写)的缩写。 ![输入图片说明](/images/Cimages/array-master/18.png) 最后修改:2022 年 05 月 29 日 © 允许规范转载 打赏 赞赏作者 赞 如果觉得我的文章对你有用,请随意赞赏