c语言程序设计易错题,c程序设计错题集

错题集

数组:

1.数组定义中,数组名后是用方括号括起来的常量表达式,不能用圆括号。(正确)

解析:数组标准样式array[ ],不能用array();

2.函数strcmp从头至尾顺序地将其对应字符比较,遇到两个字符不等时,两个字符相减得到一个int型值,两个字符串完全相同时,则返回0。

(正确)

解析:用strcmp函数时头文件用#include

在字符串比较时 如果相等时 返回int值0

如果字符串1>字符串2,则返回正整数

反之返回负整数。

3 .数组定义后,只能引用单个的数组元素,而不能一次引用整个数组。

(正确)

解析:数组只能用循环输出,

但是字符串数组可以用%s输出

4 .若有定义int a[]={2,4,6,8,10},a[1]和a++表示的含义相同。

(错误)

解析:a为数组名,数组名不能自增。

程序填空题:

1.选择法排序:本题要求将给定的nnn个整数从小到大排序后输出。输出时相邻数字中间用一个空格分开,行末不得有多余空格。

#include

#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

#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]的值。

427193990c82a2be91482a6eda96d420.png

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选项数组名不能自增。

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值