错题集
数组:
1.数组定义中,数组名后是用方括号括起来的常量表达式,不能用圆括号。(正确)
解析:数组标准样式array[ ],不能用array();
2.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。
(正确)
解析:用strcmp函数时头文件用#include<string.h>
在字符串比较时 如果相等时 返回int值0
如果字符串1>字符串2,则返回正整数
反之返回负整数。
3 .数组定义后,只能引用单个的数组元素,而不能一次引用整个数组。
(正确)
解析:数组只能用循环输出,
但是字符串数组可以用%s输出
4 .若有定义int a[]={2,4,6,8,10},a[1]和a++表示的含义相同。
(错误)
解析:a为数组名,数组名不能自增。
程序填空题:
1.选择法排序:本题要求将给定的nnn个整数从小到大排序后输出。输出时相邻数字中间用一个空格分开,行末不得有多余空格。
#include <stdio.h>
#define MAXN 10
int main()
{
int i, index, k, n, temp;
int a[MAXN];
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
for(k = 0; k < n-1; k++){
index = k
for(i = k + 1; i < n; i++){
if(a[i] < a[index]){
index = i;
}
}
temp = a[index]; a[index] = a[k]; a[k] = temp;
}
for(i = 0; i < n; i++) {
if((i == 0)){
printf("%d", a[i]);
}else{
printf(" %d", a[i]);
}
}
printf("\n");
return 0;
}
2.冒泡法排序:本题要求将给定的nnn个整数从小到大排序后输出。输出时相邻数字中间用一个空格分开,行末不得有多余空格。
#include <stdio.h>
#define MAXN 10
int main()
{
int i, index, j, n, repeat, temp;
int a[MAXN];
for(repeat = 1; repeat <= 4; repeat++){
scanf("%d", &n);
for(i = 0; i < n; i++){
scanf("%d", &a[i]);
}
for( i = 1; i < n; i++ ){
for(j = 0; j < n-i; j++ ) {
if (a[j] > a[j+1]){
temp = a[j]; a[j] = a[j+1]; a[j+1] = temp;
}
}
}
for(i = 0; i < n; i++) {
if (i == 0){
printf("%d", a[i]);
}else{
printf(" %d", a[i]);
}
}
printf("\n");
}
return 0;
}
文件流:
1.随机操作只适用于二进制文件。
(错误)
解析:随机操作文本指的是用seek函数重新定位文件指针进行读写操作,访问数组中的元素也是随机的,知道下标就可以,所以说随机操作不只是针对于文件来讲。
2.以“a”方式打开一个文件时,文件指针指向文件首。
(错误)
解析:文件打开时,原有文件内容不被删除,位置指针移到文件末尾,可以进行添加或读操作
3.fopen函数打开文件失败时,返回给文件指针的值是NULL。
(正确)
解析:NULL的值为0,当fopen失败时返回NULL。
4.直接访问就是直接利用变量的地址直接进行访问。
(正确)
解析:a. 直接访问某个地址,就相当于你知道某个物品放在某个抽屉里,然后你去那个抽屉,然后访问你的物品。
b. 间接访问就是,你知道某个抽屉放着一个纸条,纸条写着:某某物品存放于某某另外一个抽屉。
这样的话
a里面的抽屉,就是变量,
b里面存放纸条的抽屉,就是指针,指针的值,就是那个纸条,纸条指向另外一个抽屉(变量),另外一个抽屉存放的东西,就是一个变量的值。
5.int (p)[4]它表示p是一个指针数组,它包含4个指针变量元素。
(错误)
解析:数组指针是指向数组地址的指针,其本质为指针;指针数组是数组元素为指针的数组(例如 int p[4],定义了p[0],p[1],p[2],p[3]三个指针),其本质为数组。数组指针的使用在某些情况下与指针数组很相似,要注意区别。p是一个指针变量,它指向包含4个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位。(p+i)是一维数组a[i][0]的地址;(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),((p+2)+3)表示a[2][3]的值
扩展:对指针进行初始化或赋值只能使用以下四种类型的值:
- 0 值常量表达式,例如,在编译时可获得 0 值的整型 const对象或字面值常量 0。
- 类型匹配的对象的地址。
- 另一对象末的下一地址。
- 同类型的另一个有效指针。
6.结构体类型本身不占用内存空间,结构体变量占用内存空间。
(正确)
解析:结构体类型的定义只是告诉编译器该如何表示数据,但是它没有让计算机为其分配空间。结构体类型的定义就是结构体的声明,不管是定义还是申明,这句话都是正确的。
只有在结构体变量,声明的时候可以分配。要使用结构体,那么就需要创建变量,也就是结构体变量。
结构链表:
1.单向链表中的每个结点都需要动态分配内存空间。
(正确)
解析:定义的结构体指针只是说明这个指针是指向这个结构的,但并未给它分配内存空间,这就类似于声明,只是告诉系统我这个指针是干什么用的。链表是由一个个的结点链接起来的,而每个结点都是需要内存空间来存储数据的,所以你每新建一个结点,都需要开辟一个空间来存储数据。
2.在一个以 h 为头的单向链表中,p 指针指向链尾的条件是:
A.p->next=h
B.p->next=NULL
C.p->next->next=h
D.p->.data=-1
(A)
解析:首先链表为不带头结点的,然后循环链表首尾相连即尾的next指向了头,如果要求p指向尾,则肯定有p->next=h。
3.对于一个头指针为head的带头结点的单链表,判定该表为空表的条件是:
A.headNULL
B.head→nextNULL
C.head→next==head
D.head!=NULL
(B)
解析:要其后面的指针指向空时要头指针指向的值为空。
4.已知有如下C语言代码:(2分)
struct node {
int val;
struct node *next;
} p[3] = { 4, &p[2], 6, &p[0], 5, &p[1] };
其中值为6的表达式是:
A.p[1].next->val
B.(&p[0])->next->val
C.p[2].val
D.p[2].next->val
(D)
解析:一开始p[]为结构体数组变量,当其选出里面p[2]的指针(地址)再用其指向Int 型的VAL。
结构体:
1.int (p)[4]它表示p是一个指针数组,它包含4个指针变量元素。
(错误)
解析: 此表达式是一个数组指针,p是一个指向含有四个整型元素的一维数组的指针。数组指针是指向数组地址的指针,其本质为指针;指针数组是数组元素为指针的数组(例如 int p[4],定义了p[0],p[1],p[2],p[3]三个指针),其本质为数组。数组指针的使用在某些情况下与指针数组很相似,要注意区别。
p是一个指针变量,它指向包含4个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位。
(p+i)是一维数组a[i][0]的地址;(p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),((p+2)+3)表示a[2][3]的值。
2.指针数组的每个元素都是一个指针变量.
(正确)
解析:指针数组如:int *p[3],其每一个元素都是一个指针。
补充:1.指针常量——指针类型的常量(int *const p) 本质上一个常量,指针用来说明常量的类型,表示该常量是一个指针类型的常量。在指针常量中,指针自身的值是一个常量,不可改变,始终指向同一个地址。在定义的同时必须初始化。
2.常量指针——指向“常量”的指针(const int *p, int const *p) 常量指针本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。在常量指针中,指针指向的内容是不可改变的,指针看起来好像指向了一个常量。
3.char *s=“C Language”;表示s是一个指向字符串的指针变量,把字符串的首地址赋予s。
(正确)
解析:s为指针变量,后面的一句话为字符串,其的意义就是将字符串的首地址赋给指针变量s。
4.结构体成员的类型必须是基本数据类型。
(错误)
解析:结构体成员的类型也可是结构体类型。
5.语句int *p,q,r; 定义了3个指针变量。
(错误)
解析:要如下定义:int *p,*q,*r
6.对于定义int a[10],*p=a; 语句p=a+1;和a=a+1;都是合法的。
(错误)
解析:数组名不能自增。
7.使用结构指针作为函数参数只要传递一个地址值,因此,能够提高参数传递的效率。
(正确)
解析:传递地址时,只需知道它指向的下个地址在哪个地方可以直接调用。
8.若变量已正确定义并且指针p已经指向某个变量x,则(p)++相当于__B__。
A.p++
B.x++
C.(p++)
D.&x++
解析:++的优先级大于而括号又最大所以p先与括号内的结合再++。
9.对于以下结构定义,++p->str中的++加在_A__。 (2分)
struct {
int len;
char *str;
} *p;
A.指针str上
B.指针p上
C.str指的内容上
D.以上均不是
解析:->的优先级大于++,所以指针P先->str再++。所以++加在str上。
10.根据声明int a[10], *p=a; ,下列表达式错误的是
A.a[9]
B.p[5]
C.a++
D.*p++
©
解析:C选项数组名不能自增。
来源:CSDN
作者:krrri
链接:https://blog.csdn.net/krrri/article/details/103757340