C语言基础 — ( 数组——同类型批量数据)

欢迎小伙伴的点评✨✨ 本篇章系列是对C语言的深度思考和总结、关于C语言内容会持续更新


前言

本章将会给大家带来,在C语言中怎样使用数组来处理同类型的批量数据。


一、数组是什么?

一批具有同名的同属性的数据就组成一个数组(array)
(1) 数组是一组有序数据的集合 。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号。
(2) 用一个数组名和下标来唯一地确定数组中的元素,如 A[0]。
(3) 数组中的每一个元素都属于同一个数据类型。 不能把不同类型的数据放在同一个数组中。

二、怎样定义和引用一维数组

2.1、怎样定义一维数组

要使用数组,必须在程序中先定义数组,即通知计算机:由哪些数据组成数组,数组中由多少元素,属于哪个数据类型。否则计算机不会自动地把一批数据作为数组处理。
例如,下面是对数组的定义:
int a[10];
它表示定义了一个整型数组,数组名为a , 此数组包含10个整型元素。
定义一维数组的一般形式为
类型符 数组名[常量表达式];
说明:
(1) 数组名的命名规则和变量名相同,遵循标识符命名规则。
(2) 在定义数组时,需要指定数组中元素的个数,方括号中的常量表达式用来表示元素的个数,即数组长度。例如,指定 a[10],表示a数组有10个元素。 注意,下标是从0开始的,这10个元素是 a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]。
请特别注意,按上面的定义,不存在数组元素a[10]。
(3)常量表达式中可以包括常量和符号常量,如 int a[3+5]; 是合法的。不能包含变量,如 int a[n]; 是不合法的 ,但是当 n 为确切的整数时,是合法的 。例如,下面这样定义数组是不行的:
int n;
scanf(“%d”,&n); //企图在程序中临时输入数组的大小
int a[n];
但是下面定义数组是可以的
int n=0;
scanf(“%d”,&n); //企图在程序中临时输入数组的大小
int a[n];
用一个 int a[10]; 定义了数组a后 ,在内存中划出一片存储空间,存放了一个有10个整型的数组(如果编译器的int类型 是按照4个字节划分的,此空间大小为4✖10=40字节)。可以看到,用一个 int a[10]; , 就相当于定义了10个简单的整型变量,显然简捷方便。

2.2、怎样引用一维数组

在定义数组并对其中各元素赋值后,就可以引用数组中的元素。应注意:只能引用数组元素而不能一次整体调用整个数组全部元素的值。
引用数组元素的表示形式为
数组名[下标]
例如,a[0] 就是数组 a 中序号为 0 的元素 ,它和一个简单变量的地位和作用相似。 下标 可以是整型常量或整型表达式。例如下面的赋值表达式包含了对数组元素的引用:
a[0] = a[5] + a[7] - a[2*3]
每一个数组元素都代表一个整数值。

注意: 定义数组是用到的 数组名[常量表达式] 和 引用数组元素时用的 数组名[下标] 形式相同,但含义不同。例如:
int a[10]; //前面有 int ,这是定义数组,指定数组包含10 个元素
t = a[6]; //这里的 a[6] 表示引用 a数组中序号为 6 的元素

2.3、一维数组的初始化

为了使程序简洁,常在定义数组的同时给各数组元素赋值,这称为数组的 初始化 。 可以用 初始化列表 方法实现数组的初始化。
(1) 在定义数组时对全部数组元素赋予初值。例如:
int a[10] = {0,1,2,3,4,5,6,7,8,9};
将数组中各元素的初值顺序放在一对花括号内,数据间用逗号分隔。花括号内的数据就称为 初始化列表 。经过上面的定义和初始之后,a[0] = 0 , a[1] = 1, a[2] = 2 , a[3] = 3 , a[4] = 4 , a[5] = 5 , a[6] = 6 , a[7] = 7 ,a[8] = 8 , a[9] = 9 。
(2) 可以只给数组中的一部分元素赋值。例如:
int a[10] = {0,1,2,3,4};
定义a数组有10个元素,但花括号内只提供5个初值,这表示示只给前面5个元素赋初值,系统自动给后5个元素赋初值为0。
(3) 如果想使一个数组中全部元素值为0,可以写成
int a[10] = {0,0,0,0,0,0,0,0,0,0};

int a[10] = {0}; //未赋值的部分元素自动设定为0
(4) 在对全部数组元素赋初值时,由于数据的个数已经确定,因此可以不指定数组长度。例如:
int a[ 5 ] = {1,2,3,4,5};
可以写成
int a[ ] = {1,2,3,4,5};
在第2种写法中,花括号中有5个数,虽然没有在方括号中指定数组的长度,但是系统会根据花括号中数据的个数确定 a 数组有5个元素。但是,如果数组长度于提供初值的个数不相同,则方括号中的数组长度不能省略。例如,想定义数组长度为10 ,就不能省略数组长度的定义,而必须写成
int a[10] = {1,2,3,4,5};
只初始化前5个元素,后5个元素为0 。

说明: 如果在定义数值型数组时,指定了数组的长度并对之初始化,凡未被 初始化列表 指定初始化的数组元素 ,系统会自动把它们初始化为0 (如果是字符型数组,则初始化为 ‘\0’ ,如果是指针型数组,则初始化为NULL ,即空指针) 。

三、怎样定义和引用二维(多维)数组

二维数组常称为矩阵(matrix)。把二维数组写成行(row)和列(column)的排列形式,可以有助于形象化地理解二维数组的逻辑结构。

3.1、怎样定义二维(多维)数组

float pay[3][6];
以上定义了一个float型的二维数组,第一维有3个元素,第二维有6个元素。每一维的长度分别用一对方括号括起来。
二维数组定义的一般形式为
类型说明符 数组名[常量表达式][常量表达式];
例如:
float a[3][4] , b[5][10];
定义a 为3×4(3行4列)的数组,b 为5×10(5行10列)的数组。
注意 ,不能写成float a[3,4],b[5,10]; //在一对方括号内写两个下标,错误
C语言对二维数组采用这样的定义方式,使得二维数组可被看作一种特殊的一维数组:它的元素又是一个一维数组。
例如,可以把a 看作一个一维数组,它有3个元素:
a[0],a[1],a[2]
每个元素又是一个包含4个元素的一维数组,如下:
a[0] ---- a[0][0] a[0][1] a[0][2] a[0][3]
a[1] ---- a[1][0] a[1][1] a[1][2] a[1][3]
a[2] ---- a[2][0] a[2][1] a[2][2] a[2][3]
可以把 a[0],a[1],a[2] 看作3个一维数组的名字。上面定义的二维数组可以理解为定义了3个一维数组,即相当于
float a[0][4] , a[1][4],a[2][4];
此处把a[0] , a[1] ,a[2] 看作一维数组名。C语言的这种处理方法在数组初始化和用指针表示是显得很方便。
注意: 用矩阵形式(如 3行4列形式) 表示二维数组,是逻辑上的概念,能形象地表示出行列的关系。而在内存中,各元素是连续存放的,不是二维的,是线性的。
C语言还允许使用多维数组。定义三维数组的方法如下:
int a[2][2][2] ; //定义三维数组 a 它有2页,2行,2列 2 * 2 * 2=8个元素
多维数组在内存中,各元素是连续存放的,不是多维的,是线性的。

3.2、怎样引用二维(多维)数组

二维数组元素的表示形式为
数组名[下标][下标]
例如,a[2][3]表示 a数组中序号为2的行中序号为3的列的元素。下标应是整型表达式,如 a[2-1][2 * 2 - 1]。不要写成 a[2 , 3] , a[ 2-1 , 2 * 2-1]形式。
数组元素可以出现在表达式中,也可以被赋值,例如:
a[1][2] = a[2][3]/2
注意:在引用数组元素时,下标值应在以定义的数组大小的范围内。在这个问题上常出现错误。例如:
int a[3][4]; //定义a 为3×4的二维数组

a[3][4]=3; //不存在a[3][4]元素
按以上的定义,数组a可用的 行下标 的范围为0 ~ 2 , 列下标 的范围为0 ~ 3 。用a[3][4] 表示元素显然超过了数组的范围。
注意; 请严格区分在定义数组时用的a[3][4]和引用元素时的a[3][4]的区别。
前者用a[3][4] 来定义数组的维数和各维的大小,后者a[3][4]中的3和4是数组元素的下标值, a[3][4]代表行序号为3 ,列序号为4的元素(行序号和列序号均从0起算)

3.2、二维(多维)数组的初始化

可以用 初始化列表 对二维数组初始化
(1) 分行给二维数组赋初始值。例如:
int a[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12}};
三维数组的初始化: int a[2][2][2] = { { {0,1},{2,3}},{ {4,5},{6,7}}};
这种赋初值方法比较直观,把第1个花括号内的数据给第1行的元素,第2个花括号内的数据赋给第2行元素… 即按行赋初值。
(2) 可以将所有数据写在一个花括号内,按数组元素在内存中的排列顺序对各元素赋初值。例如:
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
效果与前相同。但以第(1)种方法为好,一行对一行,界限清楚。用第(2)种方法如果数据多,则会写成一大片,容易遗漏,也不易检查。
(3) 可以对部分元素赋初值。例如:
int a[3][4] = { {1} , {5} , {9} };
它的作用是只对各行第1列(序号为0的列)的元素赋初值,其余元素值自动为0。
也可以对各行中的某一元素赋初值,例如:
int a[3][4] = { {1} ,{0,6},{0,0,11}};
这种方法对非0元素少时比较方便,不必将所有的0都写出来,只须输入少量数据。
也可以只对几行元素赋初值
int a[3][4] = { {1} ,{5,6} };
第三行不赋值。
也可以对第2行不赋值,例如:
int a[3][4] = { {1} , { } , {9} };
(4) 如果对全部元素都赋初值(即提供全部初始数据),则定义数组时对第1维的长度可以不指定,但第2维的长度不能省。例如:
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
与下面的定义等价:
int a[ ][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
系统会根据数据总个数和第2维的长度算出第1维的长度。数组一共有12个元素,每行4列,显然可以确定行数为3。
在定义时也可以只对部分元素赋初值而省略第1维的长度,但应分行赋初值。例如:
int a[ ][4] = { {0,0,3} ,{ } ,{0,10}};
这样的写法,能通知编译系统;数组共有3行。

四、总结

一批具有同名的同属性的数据就组成了一个数组。数组可以根据不同的数据类型,去按照数据类型分配内存,用于存储同名同属性的数据。

猜你喜欢

转载自blog.csdn.net/weixin_44759598/article/details/128622519