首页 理论教育 C语言一维数组的存储情况及使用方法

C语言一维数组的存储情况及使用方法

时间:2023-10-27 理论教育 版权反馈
【摘要】:图4.1整型一维数组a[5]的存储情况对于数组类型说明应注意以下几点:①数组的类型实际上是指数组元素的取值类型。数组元素通常也称为下标变量。例4.1在数组中存储10 个同学C语言的成绩,并求出平均成绩,运行结果如图4.2所示。图4.2例4.1 程序运行结果C语言允许用表达式表示下标。图4.4例4.3 程序运行结果程序分析:本程序是利用冒泡法对一组成绩按照从大到小的顺序进行排序。

C语言一维数组的存储情况及使用方法

任务描述

在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。

一维数组是由一个下标表示且从0 开始排列的结构单一的数组,是二维数组和多维数组的基础。数组是一个由若干同类型变量组成的集合,引用这些变量时可用同一名字。数组均由连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应最后一个元素,数组可以是一维的,也可以是多维的。

知识学习

(1)一维数组的定义

在C语言中使用数组必须先进行定义。一维数组的定义方式为:

类型说明符数组名[常量表达式];

其中:

①类型说明符是任意一种基本数据类型或构造数据类型。

②数组名是用户定义的数组标识符。

③方括号中的常量表达式表示数据元素的个数,也称为数组的长度,数组元素的表示从下标0 开始。

④C语言编译系统为数组分配连续的存储空间,数组名代表数组在内存中存放的首地址(即数组第一个元素在内存中的存储地址)。

例如:

其中数组a 的存储方式如图4.1所示,每个存储单元占4 个字节(VS 2015 上运行)。

图4.1 整型一维数组a[5]的存储情况

对于数组类型说明应注意以下几点:

①数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。

②数组名的书写规则应符合标识符的书写规定。

③数组名不能与其他变量名相同。

例如:

错误的。

④方括号中常量表达式表示数组元素的个数,如a[5]表示数组a 有5 个元素。但是其下标从0 开始计算。因此5 个元素分别为a[0]、a[1]、a[2]、a[3]、a[4]。

⑤不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。

例如:

⑥允许在同一个类型说明中,说明多个数组和多个变量。

例如:

int a,b,c,d,k[20];

(2)一维数组元素的引用

数组必须先定义后使用。在数组的使用时要注意:C语言规定只能逐个引用数组元素,而不能一次引用整个数组。数组元素引用的一般形式是:

数组名[下标]

其中的下标只能为整型常量或整型表达式。如为小数时,C 编译将自动取整。

例如:

a[10]

a[i+j]

a[i++]

都是合法的数组元素。

数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。

例如:输出有10 个元素的数组必须使用循环语句逐个输出各下标变量。

而不能用一个语句输出整个数组,下面的写法是错误的:

printf("%d",a);

由此可见,数组名后中括号内的内容在不同场合的含义是不同的:在定义时它代表数组元素的个数,其他情况则是下标(与数组名联合起来表示某一个特定的数组元素)。

例4.1 在数组中存储10 个同学C语言的成绩,并求出平均成绩,运行结果如图4.2所示。

图4.2 例4.1 程序运行结果

C语言允许用表达式表示下标。由此可见,数组名后中括号内的内容在不同场合的含义是不同的:在定义时它代表数组元素的个数,其他情况则是下标(与数组名联合起来表示某一个特定的数组元素)。数组元素存放是按照下标的顺序按次序存放的。

(3)一维数组的初始化

给数组赋值的方法除了用赋值语句对数组元素逐个赋值外,还可采用初始化赋值和动态赋值的方法。

1)数组初始化赋值

数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的,这样可减少运行时间,提高效率。

初始化赋值的一般形式为:(www.xing528.com)

类型说明符数组名[常量表达式] ={值,值,……,值};

其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。

例如:

int a[10] ={0,1,2,3,4,5,6,7,8,9 };

相当于

a[0] = 0,a[l] = 1,…a[9] = 9;

C语言对数组的初始化赋值还有以下几点规定:

a.可以只给部分元素赋初值。当{}中值的个数少于元素个数时,只给前面部分元素赋值。

例如:

int a[10] = {0,l,2,3,4};

表示只给a[0] ~a[4] 5 个元素赋值,而后5 个元素自动赋0 值。

b.只能给元素逐个赋值,不能给数组整体赋值。

例如:给10 个元素全部赋1 值,只能写为:

int a[10] = {1,1,1,1,1,1,1,1,1,1};

而不能写为:

int a[10] = 1;

c.如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。

例如:

int a[5] = {1,2,3,4,5};

可写为:

int a[] ={1,2,3,4,5};

2)动态赋值

可以在程序执行过程中,对数组作动态赋值,这时可用循环语句配合scanf 函数逐个对数组元素赋值。

例4.2 一维数组初始化的几种形式,运行结果如图4.3所示。

图4.3 例4.2 程序运行结果

注意:数组初始化的赋值方式只能用于数组的定义,定义之后再赋值只能一个元素一个元素地赋值。

(4)一维数组的程序举例

例4.3 用冒泡法对10 个整数进行从小到大排序,运行结果如图4.4所示。

图4.4 例4.3 程序运行结果

程序分析:

本程序是利用冒泡法对一组成绩(10 个数)按照从大到小的顺序进行排序。

冒泡法的算法思路如下:

①首先通过n-1 次比较,从n 个数中找出最小的,将它与第一个数交换,进行第一次选择排序,结果最小的数被安置在第一个元素位置上。

②再通过n-2 次比较,从剩余的n-1 个数中找出关键字次小的记录,将它与第二个数交换,进行第二次选择排序。

③重复上述过程,共经过n-1 次排序后,排序结束。

例4.4 某选秀节目有10 个评委,根据评委打分情况,找出最高分和最低分,运行结果如图4.5所示。

图4.5 例4.4 程序运行结果

程序分析:

本例程序中第一个for 语句逐个输入10 个数到数组a 中,然后把a[0]送入max 和min中。在第二个for 语句中,从a[1]到a[9]逐个与max 中的内容和min 中的内容比较,若比max的值大,则把该下标变量送入max 中,若比min 的值小,则把该下标变量送入min 中,因此max总是在已比较过的下标变量中为最大者,min 总是在已比较过的下标变量中为最小者。比较结束,输出max 的值和min 的值。

任务总结

在问题分析时如遇见数据太多,将考虑用数组表示。

一维数组的特点如下:

①一维数组定义时必须指定其大小,如:int a[5];。只有当定义并初始化时其大小可以省略不写,如:int a[5] ={10,20,30,40,50}; 等价于int a[ ] ={10,20,30,40,50}。

②一维数组中所有数组元素数据类型一致,不可能存在数组中出现两种或者两种以上的数据类型。

③一维数组中所有数组元素在内存中是连续存储的。

④一维数组中所有数组元素的存储空间都相同。

⑤一维数组的数组名等价于该数组首元素的地址,如:int a[5];,则有a 等价于&a[0]。注意此知识点将会在后期指针部分使用到。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈