C语言绝对值得一看的常识讲解:批量同类型数据的组织——数组篇 篇1(一维)

这里有一个小问题:

用N个变量存储N个整数,怎么查找出其中值最大的变量呢?

这个问题中存在两个问题:
①如何定义变量?如何定义这么多简单变量命名?如果用之前的基本数据类型定义不仅效率低下,而且这么多的变量定义会使程序冗长。 

②如何处理变量?这些简单变量在内存中占用各自的存储单元,不能体现变量之间的关联性,而且分散存储的变量难以实现对这些变量的连续访问。

为了解决上面的两个问题,我们就要引入今天要讲的主角——数组。前面我们讲过一些基本的数据类型,它们能帮助我们解决一些简单的问题。但是实际问题需要处理的数据常常具有这样的特点:数据量很大,并且具有相同的数据类型。大多数程序设计语言提供了数组来组织这种具有相同数据类型的批量数据,这里就和大家分享一下数组的相关知识。

目录

1.一维数组的定义

2.一维数组元素的引用

3.一维数组的初始化

4.一维数组在内存中的存储

5.一维字符数组的说明


 一维数组

数组是具有相同类型,并按次序排列的数据集合。每个数据集合都有一个名字,称为数组名,构成数组的每个数据称为数组元素。一维数组仅使用一个下标即可唯一标识数组元素。本质上,一维数组就是数据集合的线性排列,因此,一维数组也称为向量。

1.一维数组的定义

一维数组的定义类似于基本数据类型变量的定义,但定义一维数组时需要说明其所包含的元素个数。一维数组定义的一般形式为

数据类型 数组名 [整型常量表达式];

其中,类型名可以是任何合法的数据类型,表示数组元素的数据类型(也称为基类型);数组变量名(即数组名)是一个标识符;方括号是数组的标志,其中的常量表达式,用于指定一维数组可以包含的元素的个数。一维数组包含的元素个数也称为一维数组的长度。

int a[13];//定义数组a,数组元素的数据类型是int,共有10个元素
double b[3];//定义数组b,数组元素的数据类型是double,共有3个元素
float c[2];//定义数组c,数组元素的数据类型是float,共有2个元素

标准C不允许对数组长度进行动态定义,即不允许通过变量定义一维数组的长度,因此数组长度必须是一个固定的值。(后来又出现一个变长数组,允许使用变量对于数组长度进行定义,但是只能在数组定义时使用)

2.一维数组元素的引用

数组时将固定的元素组成一个序列,每个元素在数组中都有一个序号(称为下标),通过数组名和该元素在数组中的下标来引用某个数组元素。

引用一维数组元素的一般形式为:

数组名 [整型表达式];//整型表达式即为该元素的下标

①其中,整形表达式是运算结果为整型的表达式,可以包含整型变量和整型常量,将整型表达式的运算结果作为数组下标,C语言规定数组下标从0开始,因此数组下标的取值范围[0,数组长度-1]。

数组下标从0开始可以简化编译器,使得数组元素的访问速度有小幅度的提升。例如,要访问元素a[i],编译通过数组名得到数组所在存储空间的起始地址,再进行如下地址运算a+i*sizeof(a[0]),如果下标从1开始,就需要进行如下地址运算:a+(i-1)*sizeof(a[0])

如上面所示,其实我们所看到的a[i]是方便我们调用数据,而对于计算机而言,a[i]事实上等价于*(a+i*sizeof(a[0])),这一点在后面会提到。

定义数组后,数据中的每一个元素其实就相当于一个变量,同简单变量一样,也具有变量名、变量值、类型和地址的变量的基本类型。

②参加处理的只能是数组的单个元素,而不能对数组整体进行处理。

3.一维数组的初始化

定义一维数组变量后,编译器会给该变量分配一段连续的存储空间,但是数组变量是“值无定义的”,可以在定义一维数组变量时为数组元素赋初值,对一维数组进行初始化。 

数据类型 数组名 [整型常量表达式] = {初值表};

其中,初值是由逗号分隔的数据值;则整型常量表达式表示数组的长度,如果缺省,则将初值表中的初值个数作为数组长度。在定义数组时,为了提高程序的可读性,建议无论是否给数组全部元素赋初值,都不要省略数组长度。如果给数组全部元素赋初值,而且初值个数较多,可以省略数组长度,从而避免人工计算的繁琐和误差。

将初值表中各数据顺序赋给数组中相应的元素。如果提供的初值个数小于数组长度,则未指定数组元素被赋值为0,也称为部分初始化;如果提供的初值多于数组个数,取决于编译器,有些编译器会忽略多余的初值,有些编译器会给出错误信息。

4.一维数组在内存中的存储

C语言规定,将数据装入内存时,必须为其分配一段连续的内存区域,并用数组名标识所分配内存区域的起始地址。该地址也是数组首元素的地址,因此也称为首地址。数组所占内存区域的大小等于各元素所占区域之和。一个数组所需要内存的大小,可以通过sizeof运算符进行查看。

总字节数=sizeof(数组类型)*数组长度

在之前的运算符篇有几个运算符没有讲,其中有种运算符是“*”,它长得和乘法不能说很相似,只能说一模一样,但是它的名字是解引用运算符,作用是得到指针所指内容,具体作用如下图

不能看出来*p = a,即该运算符的作用就是对某地址进行运算,然后得到地址指向的内容。

联系上面地址运算:a+(i-1)*sizeof(a[0]),我们可以得到一个新的等式

a[i]=*(a+(i-1)*sizeof(a[0]))

所以,我们在使用时也可以这样使用 ,换句话说对于计算机而言,这两种形式的本质是一样的。

5.一维字符数组的说明

①C语言中没有提供字符串变量。字符串是作为字符数组进行处理的。例如,为了存储字符串"C Program!"中的各个字符,可以定义一个一维数组。即,

char ch[10] ={'C',' ','P','r','o','g','r','a','m','!'};

此时字符串数组的实际长度和字符数组的长度相同。有时,需要计算字符串的有效长度,而不是字符数组的长度。例如,定义一维字符数组的长度为1000,而实际长度有效字符只有10个。

为了计算字符串中的有效长度,C语言规定,字符串以'\0'作为结束标志,即字符串中,从左第一个字符'\0'前的字符为有效字符。把一个字符串存入一维字符数组时,也需要把'\0'存入数组。因此,定义存储字符串的一维数组时,数组长度至少要比字符串的有效字符的个数多1。

②设“str”是一个字符数组的名字,则格式字符“%S”,可以用于字符串的输入和输出。

printf("%s",str);
scanf("%s",str);

③使用scanf输入多个字符串时,则字符串之间使用一个或多个空白字符隔开。

scanf("%s%s",str1,str2);
  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值