第4章 数组
与指针有关的题目,请主动略过!
4.1内容概述
本章主要介绍了数值数组和字符数组的定义、初始化、元素引用和数组数据的输入与输出,字符数组实现字符串、字符串函数的实现与调用。指针数组与数组指针定义、元素引用。利用一维数组实现如挑数、排序、求和等实际应用问题。利用二维数组实现矩阵的应用问题。利用字符数组实现字符串的各种操作。本章知识结构如图4.1所示。
定义
初始化
数值数组
元素引用
数组元素输入和输出
数组
字符数组
定义 初始化 元素引用
数组元素输入和输出
图4.1 第4章知识结构图
考核要求:掌握一维数组、二维数组、字符数组和 的定义和初始化;掌握数组元素存储地址计算;掌握数组元素的下标法、指针法引用;掌握字符数组与字符串的区别与联系;掌握有关字符串处理函数的使用方法;能利用一维数组、二维数组解决向量、矩阵等实际应用问题。
重点难点:本章的重点是一维数组、二维数组和字符数组的定义、初始化、元素引用,字符串处理函数的使用。本章的难点是字符串与字符数组的区别, 和数组元素的指针法引用。
核心考点:数组的定义、初始化和数组元素的引用方法,一维数组、二维数组和字符数组的实际应用,字符串的处理方法。
4.2 典型题解析
【例4.1】以下对一维数组a的定义中正确的是( )。 A. char a(10); B. int a[0..100];
C. int a[5]; D. int k=10;int a[k]; 解析:一维数组定义的一般形式为:
类型标识符 数组名[常量表达式]
其中,常量表达式可以是任意类型,一般为算术表达式,其值表示数组元素的个数,即数组长度。
答案:C
62
【例4.2】以下对一维数组的定义中不正确的是( )。 A. double x[5]={2.0,4.0,6.0,8.0,10.0}; B. int y[5]={0,1,3,5,7,9};
C. char ch1[ ]={'1', '2', '3', '4', '5'}; D. char ch2[ ]={'\\x10', '\\xa', '\\x8'};
解析:可以对一维数组的全部元素或部分元素赋初值。在对全部数组元素初始化时,数组长度可以省略。若数组长度没有省略,则初始化列表中值的个数不能超过数组的长度。
答案:B
【例4.3】以下对二维数组的定义中正确的是( )。
A.int a[4][]={1,2,3,4,5,6}; B. int a[][3];
C.int a[][3]= {1,2,3,4,5,6}; D. int a[][]={{1,2,3},{4,5,6}};
解析:定义二维数组时,若按一维格式初始化,则第一维的长度可以省略,此时,系统可根据初始化列表中值的个数及第二维的长度计算出省略的第一维长度,但无论如何,第二维的长度不能省略。没有初始化时,每一维的长度都不能省略。
答案:C
【例4.4】假定一个int型变量占用两个字节,若有定义:int x[10]={0,2,4}; 则数组x在内存中所占字节数是( )。
A. 3 B. 6 C. 10 D. 20
解析:一维数组在内存中所占的字节数为:数组长度×sizeof(元素类型)。 答案:D
【例4.5】以下程序的输出结果是( )。 main()
{ int a[4][4]={{1,3,5},{2,4,6},{3,5,7}};
printf(\}
A. 0650 B. 1470 C. 5430 D. 输出值不定
解析:定义的数组a为4行4列,且前三行三列元素已初始化,根据C语法规定,未初始化的元素值为0。
答案:A
【例4.6】以下程序的输出结果是( )。 main()
{ int m[][3]={1,4,7,2,5,8,3,6,9};int i,j,k=2; for(i=0;i<3;i++){ printf(\}
A. 4 5 6 B. 2 5 8 C. 3 6 9 D. 7 8 9
解析:根据初始化列表中值的个数和第二维的长度,可求得第一维长度为3。第一行的元素值依次为1,4,7;第二行元素值依次为2,5,8;第三行元素值依次为3,6,9。循环执行三次,依次输出行标为2的三个元素,即第三行的3个元素。
答案:C
【例4.7】以下程序的输出结果是( )。 main()
{ int b[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=0; for(i=0;i<3;i++) for(j=i;j<=i;j++)
63
t=t+b[i][b[j][j]]; printf(\}
A. 3 B. 4 C. 1 D. 9
解析:程序中,引用的b数组元素的行下标为循环变量i,列下标为数组元素b[j][j]。外层循环共进行3次,对于每次外循环,内层循环只执行一次(即j=i),所以变量t 的值为元素b[0][b[0][0]]、b[1][b[1][1]]、b[2][b[2][2]]的和。由于数组元素b[0][0]、b[1][1]、b[2][2]的值分别为0、1、2,所以t的值为:0+0+1+2=3。
答案:A
【例4.8】若有定义:int a[2][4];,则引用数组元素正确的是( )。 A. a[0][3] B. a[0][4] C. a[2][2] D. a[2][2+1]
解析:引用二维数组元素时,行下标范围为0~行数-1,列下标范围为0~列数-1。 答案:A
【例4.9】若有定义:int aa[8];,则不能代表数组元素aa[1]地址的是( ) 。 A. &aa[0]+1 B. &aa[1] C. &aa[0]++ D. aa+1
解析: &aa[1]、&aa[0]+1和aa+1都是数组元素aa[1]的地址。由于&aa[0]是地址值常量,不能进行自加、自减运算,所以选项C不能代表aa[1]地址。
答案:C
【例4.10】下列程序执行后的输出结果是( ) 。 main()
{ int a[3][3], *p,i;p=&a[0][0]; for(i=0;i<9;i++) p[i]=i+1; printf(\}
A. 3 B. 6 C. 9 D. 随机数
解析:二维数组的物理存储结构为一维,即按行序顺序存储在连续存储空间中。
本题中,p为指向数组元素的指针变量,初始时,p指向a[0][0]。通过指针p实现对对二维数组元素按行依次赋值。a[1][2]即p[5],其值6。
答案:B 【例4.16】若定义一个名为s且初值为\的字符数组,则下列定义错误的是( )。 A.char s[]={’1','2','3','\\0 '}; B.char s[]={\
C.char s[]={\.char s[4]={'1','2','3'}; 解析:字符数组中所存字符中有’\\0’时,字符数组才能作为字符串使用。选项A是用字符常量对字符数组初始化,且最后一个元素的值为字符串结束标记(’\\0’),所以数组s中存放的就是字符串\;选项D是用字符常量对部分元素初始化,根据 C语言的规定,系统为第四个元素赋初值为空值,即'\\0',所以数组s中存放的也是字符串\123\。选项B是直接使用字符串\对字符数组初始化;选项C也是使用字符串初始化,但是字符串不是\,而是\\n\,数组长度为5。
答案:C
【例4.17】下列程序的功能是输入N个实数,然后依次输出前l个实数和、前2个实数和、?、前N个实数和。填写程序中缺少的语句。
#define N 10 main()
{ float f[N],x=0.0;int i;
64
for(i=0;i { ① ; printf(\ } } 解析:分析程序可知,第一个循环实现数据的输入,第二个循环实现求和并输出,程序中缺少的是计算前i个实数和并存入变量x的语句。由于每次循环的x值都是在前一次循环的基础上作累加,即前i个实数和(x)等于前i-1个实数和(x)加上第i个实数f[i-1],因此,①处应填写:x=x+f[i-1];。 答案:x=x+f[i-l]; 或 x+=f[i-l]; 【例4.18】下面程序的功能是检查一个N×N矩阵是否对称(即判断是否所有的a[i][j]等于a[j][i])。请填空。 #define N 4 main() { int a[N][N]={1,2,3,4,2,2,5,6,3,5,3,7,4,6,7,4}; int i,j,found=0; for(j=0;j for( ① ;i if(found) printf(\ else printf(\} 解析:设置判断标志found,初始值为0。对于主对角线以上每个元素,分别与对称元素比较,若不相等,则将found置为1并结束比较。循环结束后,根据found的值确定是否对称。 答案:① i=j+1 ② found=1 【例4.19】编写程序,从一整型数组a的第一个元素开始,每三个元素求和并将和值存入到另一数组中(最后一组可以不足3个元素),最后输出所求的所有和值且每行输出5个值。 解析:用于存储和值的数组设为b,所有元素都初始化为0。从数组a的第一个元素开始,进行累加操作b[j]+=a[i],累加过程中,数组a的下标每自加3次,数组b的下标自加1次。重复此操作,直到数组a的所有元素累加完为止。输出时,每输出5个元素输出一次换行符\。 #define N 20 #define M N/3+1 main() { int a[N],i,j,b[M]={0}; for(i=0;i 65