C语言数组错题集锦(包括解析)
填空题:
第1题1-5
对于已正确定义的二维数组a, *(a[i]+j)与a[i][j]的含义相同。 (2分)
答案:T
解析:对于二维数组a来说,a[i]相当与i行0列的地址,即a[i]=&a[i][0],所以a[i]+j=&a[i][j],即*&a[i][j]=a[i][j]。
第2题1-7
数组名就是一个指针常量,指向数组的首元素(或者说代表了数组的首地址)。 (2分)
答案:F
解析:数组名不是一个指针常量。
指针常量——指针类型的常量(int *const p):本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。
扩展:常量指针——指向“常量”的指针(const int *p, int const *p):常量指针本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。在常量指针中,指针指向的内容是不可改变的,指针看起来好像指向了一个常量。
第3题1-10
假设有定义如下: int array[10]; 则该语句定义了一个数组array。其中array的类型是整型指针(即: int *)。 (2分)
答案: F
解析:array的类型不是指针而是数组名。
第4题1-12
一维数组定义的一般形式如下,其中的类型名指定数组变量的类型。
类型名 数组名[数组长度];
答案:F
解析:暂时不知道。
选择题:
第5题2-7
假设scanf语句执行时输入ABCDE<回车>,能使puts(s)语句正确输出ABCDE字符串的程序段是__。
A.char s[5]={“ABCDE”}; puts(s);
B.char s[5]={‘A’, ‘B’, ‘C’, ‘D’, ‘E’}; puts(s);
C.char *s; scanf("%s", s); puts(s);
D.char *s; s=“ABCDE”; puts(s);
答案:D
解析:
gets是字符串输出函数,只能输出字符串,所以排除B选项。
A:字符串s定义内存不足,出现乱码,正确的定义为:char s[6]={“ABCDE”};。
C:scanf函数不能用于指针变量的赋值,故C选项错误。
D:D选项为字符串,且符合题意,故选D。
第6题2-14
*二维数组(1-1)
下面的程序段将输出 ▁▁▁▁▁ 。
double a[4][5];
printf("%d\n", sizeof(a));
A.12
B.20
C.96
D.160
答案:D
解析:458=160,4*5为a数组所占空间,而double类型为8个字节,所以a数组所用字节为160字节,故选D选项。
第7题2-17
假定char类型变量占用1个字节,且数组定义如下,则数组tab_str在内存中所占字节数是( )。 (1分)
char tab_str [10][81];
A.810
B.10
C.81
D.0
答案:A
解析:同2-14。
多选题:
第8题3-2
在以下描述中,( )是正确的。 (1分)
A.int a[5] = {1, 2, 3, 4, 5};
定义了数组a,并对数组元素赋初值。此时,a[0]为1,a[1]为2,a[2]为3,a[3]为4,a[4]为5。
B.static int b[10];
定义了静态数组b,且10个数组元素的初值都为0。
C.int fib[45] = {1, 1};
定义了数组fib,并对数组 fib 的前2个元素赋初值,其余元素的值都为0。
D.static int week[7] = {1, 2, 3};
定义了静态数组week,并对数组 week 的前3个元素week[0]~week[2]赋初值,week[3]~week[6]值都是不确定的。
答案:AB
解析:
A:略
B:用static定义,如果不赋初值,系统会自动赋初值为0。
C:定义了数组fib,并对数组 fib 的前2个元素赋初值为1&#x