第一题
1、如下程序的运行结果是( )
char c[5]={'a', 'b', '\0', 'c', '\0'};
printf("%s", c);
A: 'a' 'b'
B: ab\0c\0
C: ab c
D: ab
答案及解析 D
首先这是一个字符数组,我们要知道无论是字符串还是字符数组,它们遇到ASCII值为0就会停止打印,而‘\0’的ASCII值为0。
然后我们以%s的格式打印这个字符数组,首先是依次输出这个字符数组的内容的,其次就是不会将里面的内容分开,最后遇到\0停止打印,故选D。
第二题
2、若有定义: int a[2][3]; ,以下选项中对 a 数组元素正确引用的是( )
A: a[2][0]
B: a[2][3]
C: a[0][3]
D: a[1>2][1]
答案及解析 D
我们要明确,引用数组和定义数组的' [ ] '的这个符号的意义是不一样的;
在定义一个数组的时候,a[n] 这里是表示a数组有n个元素;
而在引用数组的时候a[1] 的1是表示数组的下标,并且数组下标从0开始,数组最后一个元素的下标是n-1;
我们知道这些之后就看选项吧!
A,B,C明显的数组越界,因为下标是2,还有3了
D :数组下标可以用表达式的,a[1 > 2] [1] 可以看作 a[0] [1] 。1 > 2是假为0;
第三题
3、在下面的字符数组定义中,哪一个有语法错误( )
A: char a[20]="abcdefg";
B: char a[]="x+y=5.";
C: char a[15];
D: char a[10]='5';
答案及解析 D
本题考查的是数组的定义和初始化;
A:正确,字符数组可以这样定义,这是字符串的写法,“abcdefg”末尾默认有个\0,作为字符串的终点;
B:正确,虽然字符数组没有指定元素个数,但是后面初始化了,所以元素个数就是初始化的字符串的元素个数;
C:正确,定义一个未初始化的字符数组;
D:错误,字符数组的初始化,不可以是单个字符;
第四题
4、下列定义数组的语句中正确的是( )【多选】
A:
#define size 10 char str1[size], str2[size+2];
B: char str[];
C: int num['10'];
D: int n=5; int a[n][n+2];
答案及解析 A C
本题仍然考察数组的定义;
A:正确,可以使用宏来作为数组的个数,也可以使用表达式;
B:错误,不初始化数组,必须定义数组个数;
C:正确,定义一个整型数组,数组个数为‘10’,我们要记住,每个字符都有对应的ASCII值,所以也可以使用单个字符来定义数组个数
D:在C99中支持了用变量来定义数组个数,但是在这里不做参考,你知道可以就行
ASCII值表:
第五题
5、已知 i,j 都是整型变量,下列表达式中,与下标引用 X[ i ] [ j ] 不等效的是【多选】
A: *(X[ i ]+j)
B: *(X+i)[ j ]
C: *(X+i+j)
D: *(*(X+i)+j)
答案及解析 B C
这里考察的是指针的解引用和数组之间的关系
先知道这一个概念:
我们的二维数组,其实是一维数组的数组,有如下图解:
当我们真正弄懂这个概念,我们做这类题目才会快;
我们来看,一个二维数组,有三行三列,其实就是三个包含了三个元素的一维数组的数组
arr[0]是一个一维数组,我们要访问arr[0]的数组元素的时候,不就是在访问arr这个二维数组第一行的元素吗?
访问arr[0]的第一个元素,就是在访问arr这个数组的第一行第一列的元素: arr[0][0];
那我们把思维放在arr[0]是一维数组的身上,访问这个数组的第一个元素就是:arr[0][0]
我们就可以发现,arr[0]其实就相当于一维数组的数组名,要访问第一行的元素就是在数组名后面加下标引用操作符;a[0][0];a[1][0]......
所以我们来看选项:
A:*(x[i] + j),这里的x[i]相当于的是二维数组第i行的地址,+j就相当于找第i行的第j个元素的地址,再解引用就找到了x[i][j]
B:这里要注意的是操作符优先级的问题,下标引用操作符是的优先级是高于解引用的,相当于的是**((X + i) + j),数组名相当于第一行的地址,➕了i+j个,跳过了i+j行,越界了;
C:在二维数组中,数组的元素名代表的是数组第一行的地址,所以对数组的首元素相加减,跳的位置是一个行的距离,很明显,这里是X+i+j,跳过了i+j行,越界了;
D:先找到i行,解引用,再找到j个元素,解引用;得到了x[i][j]