4.1  一维数组

1.数组的基本概念

数组是一组同类对象集合的一种表示。在C语言中,数组类型是这样一种数据结构:数组所有元素的数据类型相同,元素个数固定,其元素按顺序存放,每个元素对应一个序号(称为下标),数组元素的下标从0开始顺序编号,各元素按下标存取(引用)。数组元素变量能与相同类型的独立的变量一样使用。引用数组元素变量所需的下标个数由数组的维数决定,数组有一维数组、二维数组或多维数组之分。

2.一线数组的定义

一维数组的定义形式为

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

例如

int a[5] ;

定义一个名为a的数组,它有五个元素,每个元素都是整型。数组定义包含以下几个要点:

(l)类型说明符用来指明数组元素的类型,同一数组的诸元素,它们的类型是相同的。

(2)数组是一个变量,与一般变量一样,用标识符命名,数组名遵守标识符的命名规则。

(3)方括号“[]”是数组的标志,方括号中的常量表达式的值表示数组的元素个数,即数组的长度。例如,int a[5]中的 5表示数组 a有5个元素,下标从0开始,这五个元素分别是:a[0]、a[1]、a[2]、a[3]和a[4].

(4)常量表达式通常是整型常量、符号常量或sizeof(类型名),以及由它们组成的常量表达式。定义数组大小用常量表达式,就是说数组的大小是固定的,不可以包含引用变量值的表达式来定义数组的大小。

(5)C语言有一个约定,当数组名单独出现在表达式中时,数组名可以代表为它分配的内存区域的开始地址,即数组中下标为0的元素的地址。在这种情况下,数组名起着一个常量的作用,即a与&a[0]作用一样。如代码scanf(“%d”,&a[0])与 scanf(“%d”,a)都是为数组a的第一个元素输入值。

3.一维数组的初始化

可在数组定义同时,给出数组元素的初值。这种表述形式称为数组初始化。数组初始化可用以下几种方法实现:

(l)数组定义时,顺序列出数组全部元素的初值。例如,

int d[5]={0,l,2,3,4};

将数组元素的初值依次写在一对花括弧内。经上面定义和初始化之后,就有d[0]=0.d[l]=l、d[2]=2、d[3]=3、d[4]=4.

(2)只给数组的前面一部分元素设定初值。例如,

int e[5]={0,l, 2};

定义数组e有5个整型元素,其中前三个元素设定了初值,而后两个元素末明确地设定初值。系统约定,当一个数组的部分元素被设定初值后,对于元素为数值型的数组,那些末明确设定初值的元素自动被设定0值。所以数组e的后两个元素的初值为0.但是,当定义数组时,如未对它的元素指定过初值,对于内部的局部数组,则它的元素的值是不确定的。

(3)当对数组的全部元素都明确设定初值时,可以不指定数组元素的个数。例如,

int g[]={5,6,7,8,9};

系统根据初始化的花括号内的初值个数确定数组的元素个数,所以数组g有五个元素。但若提供的初值个数小于数组希望的元素个数时,则方括号中的数组元素个数不能省略。如代码int b[10]={1,2,3,4,5}定义数组 b有10个元素,前五个元素如设定所示,后五个元素都为0.反之,如提供的初值个数超过了数组元素个数,就是一个错误。

4.一维数组元素的引用

程序定义了数组后,就可引用数组的元素。引用数组元素的一般形式为

数组名[下标]

其中下标可以是整型常量、整型变量或整型表达式。例如,数组a的五个元素可分别用a[0]、a[l]、a[2]、a[3]、a[4]来引用它们。

设有定义:

int x[20], i;

以下代码实现顺序输入数组X的全部元素:

for(i=0; i<20;i++)

scanf(“%d”,&x[i]);

4.2  二维数组和多维数组

1.多维数组定义

数组也可以是多维的。现以二维数组为例介绍二维及二维以上的多维数组。二维数组的定义形式为

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

通常多维数组的定义形式有连续两个或两个以上“「常量表达式」”。例如,

float a[2][3],b[3][4];   /*两个二维数组*/

float c[2][2][3]     ;/*一个三维数组*/

定义数组a为2行3列,数组b为3行4列。C语言把二维数组看作是一种特殊的一维数组,即它的元素又是一个数组。例如,对于上述定义的数组a,把它看作有两个元素的一维数组:

a[0]和 a[l]

每个元素又是一个包含3个元素的一维数组。通常,一个n维数组可看作是一个一维数组,而它的元素是一个(n-1)维的数组。C语言对多维数组的这种观点和处理方法,使数组的初始化、引用数组的元素以及用指针表示数组带来很大的方便。

在C语言中,二维数组的元素的存放顺序是按行存放的,即从数组的首地址开始,先顺序存放第一行的元素,再存放第二行的元素。通常,对于一个多维数组,它的元素在内存中的存放顺序有这样特点:第一维的下标变化最慢,最右边的下标变化最快。

2.引用多维数组元素

引用二维数组元素的表示形式为

数组名[下标][下标]

通常,引用n维数组元素的表示形式为数组名之后紧接连续n个“[下标]”。

在用下标引用数组的元素时,应该注意下标值的有效性,应在已定义的对应维大小的范围内,即大于等于0和小于对应维的元素个数。

3.多线数组初始化

多维数组的初始化方法也有多种,以二维数组的初始化方法为例说明其初始化方法。

(1)按行给二维数组的全部元素赋初值。例如

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

这种赋初值方法比较直观,第一个花括弧内的数据给第一行的元素赋初值,第二个花括弧内的数据给第二行的元素赋初值,依次类推,按行给数组的全部元素赋初值。

(2)按元素的存储顺序给数组元素赋初值。例如,

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

这种赋初值方法结构性差,容易遗漏。

(3)按行给数组的部分元素赋初值。例如,

int a3[2][3]={{1,2},{0,5}};

其效果是使a3[0][0]=l,a3[0][1]=2,a3[1][0]=0,a3[1][l]=5,其余均为0.

(4)按元素的存储顺序给前面部分元素赋初值。例如,

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

其效果是使a4[0][0]=1,a4[0][l]=2,a4[0][2]=3,a4[1][0]=4,其余均为0.

(5)按元素的存储顺序,给数组部分或全部元素赋初值,并且不指定第一维的元素个数。例如,

int a5[][3]={l,2,3,4,5 };

系统会根据结出的初始数据个数和其它维的元素个数确定第一维的元素个数。其效果是使:

a5[0][0]=1,a5[0][1]=2,a5[0][2]= 3,

a5[1][0]=4,a5[l][l]=5,a5[1][2]=0.

所以数组a5有2行。

(6)用按行赋初值方法,对各行的部分或全部元素赋初值,并省略第一维的元素个数。例如,

int a6[][3]={{O,2},{}};

也能确定数组a6共有2行。

4.3  字符数组和字符串

1.字符数组

如果数组的元素类型是字符型(char),则此数组就是字符数组。字符数组的每个元素只能存放一个字符(存放字符的ASCII代码)。

字符数组的定义形式与其它数组的定义形式一样:

char字符数组名[元素个数];

例如,

char S[5];

表示数组S有五个元素,每个元素能存放一个字符,整个数组最多可存放五个字符。字符数组元素的引用方法也与普通数组元素的引用方法相同。

字符数组也可与普通数组一样的初始化,字符数组也可利用字符串常量给字符数组初始化。例如,

char aStr[]={“12345”};

并可省略花括弧,简单地写为

char aStr[]=“ 12345” ;

注意:字符数组aStr[]的元素有六个,不是五个。用字符串常量对字符数组初始化,C系统会在字符列末尾添加一个字符串结束符。

2.字符串

称最后有字符率结束符'\0'的字符序列为字符串。字符数组中存储的字符序列本身并不要求最后一定要有字符'\0'.但当字符数组内存储的内容需要作为字符串时,就必须要有标记符'\'.当字符数组内存储的是字符串时,可用“%s”格式输出,若是普通的字符序列,则它不能用格式“%s”输出,而只能结合循环用格式“%c”输出。

指定元素个数的字符数组用字符串常量给它初始化时,其元素个数不能小于字符串常量的字符数,但数组的元素个数可以等于字符串常量的字符数。例如,

char ss[3]=“abc”;

则, ss[0]='a',ss[l]='b', ss[2]='c'.此时,字符数组ss中存储的是字符序列,不是字符串。

字符率结束标记符的代码是8位全0,称为空字符,程序用'\0'来标记。字符串的结束标记符紧接在字符串的有效字符列之后。例如,一个有8个有效字符的字符串,其长度为8个字符,但在它的第九个位置存有结束标记符'\0'.

请读者注意以下几点:

(l)字符率与存储字符串的字符数组有区别。字符率的有效字符是指从所指位置的第一个字符开始至字符串结束标记符之前的那些字符。格式符“%s”只输出字符串的有效字符,而不会再继续输出字符率结束标记符及其之后的字符。例如,

char str[50]=“Pas\0cal Cobol Fortran C”;

printf(“%s\n”,str) ;

将只输出:

Pas

而实际上,数组str[]字符率结束符之后还存有其它许多字符。

(2)用“%s”格式输出字符串时,不包括字符串结束标记符。对应的输出项是字符串或字符串名。字符数组名可作为字符串名。对于上例,写成

printf(“%s”,s[0]);

是错误的。因s[0]是数组s的元素,是一个字符,不是字符串。

(3)在调用scanf()为字符数组输入字符串时,输入项是数组名,不要加地址运算符&.

(4)若用“%c”格式结合循环输入字符序列,若程序又想将输入的字符序列构成字符串,则程序必须用赋值语句在字符列之后存入字符串结束标记符,使其变成字符串。

程序经常要处理许许多多的字符串,如存储星期的名称。同时存储众多字符串的一个实现方法是定义一个二维字符数组,让二维数组的每一行存储一个字符串。这样做,要求数组每行元素个数应比可能最长的字符串字符个数还要多1个。如下面的示例所示:

char weekDay[][9]=            {“Sunday”,“Monday”,“Tuesday”,“Wednesday”,

“Thursday”,“ Friday” ,“Saturday”};

在C程序中,存储多个字符串更好的方法是用指针数组。

3.常用字符串库函数

求字符串长度函数strlen()

函数调用 strlen(str)返回str中的有效字符(不包括'\0')的个数。

字符串拷贝函数strcpy()

函数调用Strcpy(strl,str2) 将字符串str2拷贝到字符数组strl.要求字符数组strl足够大,以便能容纳被拷贝的str2的全部内容。

限制字符数的字符串拷贝函数strncpy()

函数调用strncpy(strl,str2,n)的作用是将str2中的前n个字符拷贝到strl(并附加'\0')。其中n是整型表达式,指明欲拷贝的字符个数。如果str2中的字符个数不多于n,则函数调用

strncpy(strl,str2,n)等价于strcpy(strl,str2)。

字符串连接函数strcat()

函数调用strcat(strl,str2) 将str2内容拷贝接在字符数组strl中的字符串的后面。要求字符数组strl必须足够大,以便还能容纳str2的内容。该函数调用返回strl的开始地址。注意:字符串连接前,strl和str2都各自有'\0',连接后,strl中原来的'\0'在拷贝时被覆盖掉,而在新的字符率有效字符之后再保留一个'\0'.例如

char strl[30]=“Beijing”;

char str2[30]=“ Shanghai”;

函数调用

strcat(strl,str2);

printf(“%s \n”,strl);

将输出:

BeijingShanghai

字符串比较函数strcmp()

函数调用strcmp(strl,str2)批较两个字符串的大小,对两个字符串自左至右逐对字符相比较(按字符的 ASCII代码值的大小),直至出现不同的字符或遇到'\' 字符为止。如直至'\' 字符,全部字符都相同,则认为相等,函数返回0值;若出现不相同的字符,则以这第一对不相同的字符比较结果为准,若strl的那个不相同字符小于str2的相应字符,函数返回一个负整数;反之,返回一个正整数。

注意:对字符串不允许施行关系运算符比较两字符之间的大小关系,必须类似于本函数那样,通过逐个字符的比较来实现。

字符串输出函数puts( )

函数调用 puts(str) 将 str的字符串输出到终端,并将 str中的'\'以字符转换成换行符'\n'输出。即输出字符串内容后,并换行。所以,puts(str)相当于printf(“%s\n”,str)。

字符串输入函数gets( )

函数调用gets(str)从终端输入字符序列(包括空白符)到字符数组str,字符序列以回车符作为结束,并将输入时的回车符转换成'\'字符存储。该函数调用返回str的存储开始地址。调用get()函数与用“%s”格式调用格式输入函数scanf输入字符串不同,后者会自动跳过前导空白符,并以非空白符之后的空白符结束。前者用于输入一行内的全部字符,包括可能有的空白符,存放于字符数组str,并将最后读人的换行符转换成字符率结束标记存储在str中。

c语言包括在方括号中的序号称为,自考《高级语言程序设计》知识点总结(四)...相关推荐

  1. c语言中分不分大小写,C语言高级语言程序设计(一)-第四章 程序设计方法-模块化与算法设计.ppt...

    高级语言程序设计(一) (C Programming),第四讲:程序设计方法-模块化与算法设计,本章目标,进一步掌握模块化设计思想 掌握常用的数据查找及排序方法 了解全局变量 了解递归程序设计思想,问 ...

  2. c语言1e3和1e3,自考“高级语言程序设计”习题答案详解(33)

    6.1 单项选择题 1.函数调用语句"f((el,e2),(e3,e4,e5)):"中参数的个数是( ) ①1 ②2 ③4 ④5 「解」上述函数调用中,(e1,e2)和(e3,e4 ...

  3. 39 n 39 是不是c语言常量,自考“高级语言程序设计”习题答案详解(39)

    7.1 单项选择题 1.设有定义"struct {int x:int y:} d[2]={{1,3},{2, 7}}:",则 printf("%d\n", d[ ...

  4. vue中v-on指令的使用之Vue知识点归纳(四)

    本文章中描述 v-on 指令的基本使用 点击按钮动态修改数据 1 简述 vue 中 v-on 指令简单点来讲,是用来给元素设置绑定事件. 格式 v-on:事件名称="方法名称" 这 ...

  5. c语言中二维数组中维数的计算,数组指针字符串C语言程序设计-第4章.ppt

    <数组指针字符串C语言程序设计-第4章.ppt>由会员分享,可在线阅读,更多相关<数组指针字符串C语言程序设计-第4章.ppt(132页珍藏版)>请在人人文库网上搜索. 1.程 ...

  6. log包在Golang语言的标准库中是怎么使用的?

    Golang 语言的标准库中提供了一个简单的 log 日志包,它不仅提供了很多函数,还定义了一个包含很多方法的类型 Logger.但是它也有缺点,比如不支持区分日志级别,不支持日志文件切割等. 01. ...

  7. R语言在可视化图像中添加文本(Adding Text to plot)

    R语言在可视化图像中添加文本(Adding Text to plot) 创建一个好的可视化包括引导读者,使用图形讲述一个直观的故事.在某些情况下,这个故事可以以完全直观生动的方式呈现,而不需要添加文本 ...

  8. python做算法题优势_Python语言在科学算法中的优势

    2019 年第 4 期 信息与电脑 China Computer & Communication 算法语言 Python 语言在科学算法中的优势 刘 瑞 (辽宁师范大学海华学院,辽宁 沈阳 1 ...

  9. linux C语言多线程库pthread中条件变量的正确用法逐步详解

    linux C语言多线程库pthread中条件变量的正确用法: 了解pthread常用多线程API和pthread互斥锁,但是对条件变量完全不知道或者不完全了解的人群. 关于条件变量的典型应用,可以参 ...

最新文章

  1. 大佬原创 | 深度学习60讲453页pdf下载
  2. hive 语法检查_升级Hive3处理语义和语法变更
  3. linearlayout设置最大高度_一句话掌握一消建筑高度计算方法,先收藏!
  4. IMP出现的ORA-01401错误可能和字符集有关(转载)
  5. import java.io6_JavaIO(六) 转换流
  6. mysql 读写分离 事务_mysql 读写分离(基础篇)
  7. 服务器误删除虚拟机数据恢复成功
  8. MySQL高级查询语句——超详细,一篇就够了
  9. 亲密关系科学(04)让人快速爱上你的36问
  10. python语言+selenium自动化,编写脚本调用Chrome、Firefox浏览器打开百度网站
  11. GO函数内部程序执行顺序
  12. 京东方GV185FHM-N10-DM30工业液晶屏 18.5寸全视角液晶屏
  13. 使用Sigar在不同操作系统遇到的坑
  14. 鲑鱼和金枪鱼罐头的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  15. 战地系列服务器架设,战地3服务器架设数据库
  16. 数据库、mysql和sql的入门简明教程
  17. 微博舆情热点挖掘项目——A+项目
  18. 秦储数字藏品平台正式上线公测 | 实名注册用户首日突破2万!
  19. 个人常用提高办公效率软件
  20. 转:组织敏捷不是一种选择,而是一种必须!

热门文章

  1. 超专业解析!10分钟带你搞懂Linux中直接I/O原理
  2. 工程师在工作电脑存 64G 不雅文件,被公司开除后索赔 41 万,结果…
  3. 36 张图详解 DNS :网络世界的导航
  4. 选择Kong作为你的API网关
  5. Spring中的Controller ,Service,Dao是不是线程安全的?
  6. 外卖小哥转行IT面完阿里后,又回去送外卖了,真实经历!
  7. 一口气带你踩完五个 List 的大坑,真的是处处坑啊!
  8. 两万字的数据库面试题,不看绝对后悔
  9. 全球Top5互联网巨头崛起秘诀,真相竟然是?
  10. Worktile完成新一轮融资,将发力研发管理赛道