第4章 数组
4.1内容概述
本章主要介绍了数值数组和字符数组的定义、初始化、元素引用和数组数据的输入与输出,字符数组实现字符串、字符串函数的实现与调用。指针数组与数组指针定义、元素引用。利用一维数组实现如挑数、排序、求和等实际应用问题。利用二维数组实现矩阵的应用问题。利用字符数组实现字符串的各种操作。本章知识结构如图4.1所示。
图4.1 第4章知识结构图
考核要求:掌握一维数组、二维数组、字符数组和指针数组的定义和初始化;掌握数组元素存储地址计算;掌握数组元素的下标法、指针法引用;掌握字符数组与字符串的区别与联系;掌握有关字符串处理函数的使用方法;能利用一维数组、二维数组解决向量、矩阵等实际应用问题。
重点难点:本章的重点是一维数组、二维数组和字符数组的定义、初始化、元素引用,字符串处理函数的使用。本章的难点是字符串与字符数组的区别,指针数组和数组元素的指针法引用。
核心考点:数组的定义、初始化和数组元素的引用方法,一维数组、二维数组和字符数组的实际应用,字符串的处理方法。
4.2 典型题解析
【例4.1】以下对一维数组a的定义中正确的是( )。
A. char a(10); B. int a[0..100];scanf输入整型数组
C. int a[5]; D. int k=10;int a[k];
解析:一维数组定义的一般形式为:
类型标识符 数组名[常量表达式]
其中,常量表达式可以是任意类型,一般为算术表达式,其值表示数组元素的个数,即数组长度。
答案:C
【例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("%d%d%d%d\n",a[0][3],a[1][2],a[2][1],a[3][0]);
}
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("%d ",m[k][i]);}
}
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++)
t=t+b[i][b[j][j]];
printf("%d\n",t);
}
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("%d \n",a[1][2]);
}
A. 3 B. 6 C. 9 D. 随机数
解析:二维数组的物理存储结构为一维,即按行序顺序存储在连续存储空间中。
本题中,p为指向数组元素的指针变量,初始时,p指向a[0][0]。通过指针p实现对对二维数组元素按行依次赋值。a[1][2]即p[5],其值6。
答案:B
【例4.11】下列程序的输出结果是( )。
main()
{ char a[10]={9,8,7,6,5,4,3,2,1,0},*p=a+5;
printf("%d",*--p);
}
A. 运行出错 B. a[4]的地址 C. 5 D. 3
解析:初始时,p指向a[5]。由于单目运算符的结合方向为右结合,所以,*--p等价于*(--p),即先执行--p,p指向a[4],再输出a[4]的值(5)。
答案:C
【例4.12】若有如下定义,则b的值是( )。
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=&a[3],b=p[5];
A. 5 B. 6 C. 8 D. 9
解析:p指向a[3],即p=a+3;b=p[5],即b=*(p+5)。因此,b=*(a+8)=a[8]=9。
答案:D
【例4.13】若二维数组y有m列,则排在y[i][j]前的元素个数为( )
A.j*m+i B.i*m+j C.i*m+j-1 D.i*m+j+1
解析:C语言中的二维数组按行存储。行标为i的元素前共有i行元素,元素个数为i*m,每行列标为j的元素前共有j个元素。因此,y[i][j]前的元素个数为i*m+j。
答案:B
【例4.14】若有定义:char a[10],*b=a;,则不能给数组a输入字符串”This is a book”的语句是( )。
A. gets(a) B. scanf("%s",a) C. gets(&a[0]); D. gets(b) ;
解析: gets为字符串输入函数,调用该函数时需给出字符串的存储地址,以回车作为字符串输入的结束,并将回车符转换成为’\0’。而scanf函数则以回车、空格或跳格作为串输入结束,因此scanf不能输入有空格的字符串。
答案:B
【例4.15】以下程序执行后的输出结果是( )。
A. 2 B. 3 C. 4 D. 5
#include "string.h"
main( )
{ char *p[10]={ "abc","aabdfg","dcdbe","abbd","cd"};
printf("%d\n",strlen(p[4]));
}
解析:定义了一个含有10个元素的字符指针数组p,并对前5个元素初始化,其中p[4]指向字符串"cd",其串长为2。
答案:A
【例4.16】若定义一个名为s且初值为"123"的字符数组,则下列定义错误的是( )。
A.char s[]={’1','2','3','\0 '}; B.char s[]={"123"};
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论