C语言错题集

2019年C语言错题集

(包括原题,解析,拓展)

一.判断题

1.结构体变量作参数时是地址传递。(F)
c语言结构体元素作为函数参数传的是值,不是地址
2.可以把结构体数组元素作为一个整体输出。(F)
结构体数组 一个结构体变量中可以存放…之处在于每个数组元素都是一个结构体类型的数据,…作为函数参数时传递的整个集合,
3.结构体数组不可以在定义时进行初始化。(F)
结构体在定义时可以进行初始化,赋初值
4.C语言中,在进行混合运算时,数据类型由高级向低级转换。(F)
应该是低级向高级转化 char --> short --> int --> long --> unsigned long --> float --> double 系统这样处理会避免数据精度的丢失
5.执行语句++i ; i=3;后变量i的值为4。(F)
变量i的值为1
6.int a=5,p;p=&a;则p的值为5.(F)
有了int a[5],*p;,p=&a;显然就是错误的。int a[5],*p;说明了a和p都是int 型指针,只是a是常指针,p是指针变量,那么p=a;就合情合理;&a是指向a[5]的指针,与它类型匹配的是int ()[5],而不是int *。所以p=&a;的等号两边类型不匹配,
7.C语言中的文件是一种流式文件,读写时均以字符为单位。(Y)
建议记住,另外流式文件是指的C语言中对文件的处理方式。 在C语言中,处理文件时,每次的读写操作并不是直接操作存储器上的物理空间的,而是先会读出/写入到一个缓冲区…
8.文件正常关闭时返回1.(F)
当使用完一个文件后,应该将该文件关闭,以防止它再被调用。“关闭”就是是文件指针变量不再指向该文件,也就是文件指针变量与该文件“断开”,此后不能通过该指针变量对原来与其相联系的文件进行读写操作,除非再次打开,使文件变量重新指向该文件。
【调用形式】fclose(文件指针变量名)
【功能】关闭文件指针变量所指向的文件,同时自动释放分配给文件的缓冲区。
【返回值】文件能正常关闭,则返回0,否则返回非0.

9.
(a[i]+j)与a[i][j]的含义相同。(T)
*(a+i)+j就是表示下表第i行的第j个元素的地址了。
*(a+i)+j表示的含义是元素a[i][j]的地址,也可以用a[i]+j来表示。

10.可以把结构体数组元素作为一个整体输出。(F)

二.选择题

1.以下选项中,能定义s为合法的结构体变量的是( B

A. typedef  struct  abc 
   {double a;        
    char b[10];      
   }s;                     
B. struct
    {double  a;
     char b[10];
    }s;
C. struct  ABC 
   {double  a;
    char  b[10];
   }           
   ABC  s;    
D. typedef  ABC
     { double  a;
       char  b[10];
     }
     ABC  s;

2.设有以下语句:
struct st{int n; struct st *next;};
static struct st a[3]={5, &a[1], 7, &a[2], 9, ‘\0’},*p;
p=&a[0];
则表达式( D )的值是6。
A: p++ ->n
B: p->n++
C: (*p).n++
D: ++p->n
解:p指向结构体数组的第一个元素(它的值是5)+ + p->n的意思就是对其值执行自增操作,且为前置自增,因此为6
3.若要用下面的程序片段使指针变量p指向一个存储整型数据的动态存储单元,则应填入( D )。
int p;
p= malloc(sizeof(int));
A: int
B: int *
C: (
int)
D: (int *)
不论p是指向什么类型的指针变量,都可以通过强制类型转换的方法使之类型一致
==强制类型转换的格式为 ( 数据类型 * ) ==
4.下列表达式中,不满足“当x的值为偶数时值为真,为奇数时值为假”要求的是( )

A: x%2==0
B: !x%2!=0
C: (x/2*2-x)==0
D: !(x%2)
5.若有以下定义和语句,则对a数组元素地址的正确引用为________________。
int a[2][3], (*p)[3];
p=a;

A: * (p+2)
B: p[2]
C: * (p[1]+1)
D: (p+1)+2
项C中p[1]指向了数组a的第二行,p[1]+1则指向了第二行的第二个数据元素
6.若有以下定义,则对a数组元素的正确引用是(D).
int a[5],p=a;
a)
&a[5]
b)a+2
c)(p+5)
d)
(a+2)
A项,由于 a[5] 已经超出数组外了,所以 *&a[5] 不是 数组元素
B项,a+2 是a[2]的地址,不是数组元素.
C项,*(p+5)相当于a[5],已经超出数
组范围,不是数组元素
D项,正确,*(a+2)相当于 a[2]
7.若有定义:int (p)[4];则标识符p*( c )**
A: 是一个指向整型变量的指针
B: 是一个指针数组名
C: 是一个指针,它指向一个含有四个整型元素的一维数组
D: 定义不合法
8.若有语句int a[10]={0,1,2,3,4,5,6,7,8,9},*p=a;则____不是对a数组元素的正确引用(其中0≤i<10)。(B)
A: p[i]
B: ((a+i))
C: a[p-a]
D: *(&a[i])
因为p指向的就是a[0]的位置,与a本身指向的位置一样.完全可以等同a一样使用下标引用元素B. *(a+i)指向a[i]存的那个值,假设i=1,则等于a[1]=1,再求1所指向的地址的值,就不能求解了
9.对于语句int *pa[5];下列描述中正确的是 (D)
A: pa是一个指向数组的指针,所指向的数组是5个int型元素
B: pa是一个指向某数组中第5个元素的指针,该元素是int型变量
AB错因:pa是变量名称,[]优先级高于 *,所以pa是数组,数组的元素是int *
C: pa [5]表示某个元素的第5个元素的值
错因:某个数组
D: pa是一个具有5个元素的指针数组,每个元素是一个int型指针

10.下列变量定义中合法的是( A
A: short _a=1-.1e-1;
B: double b=1+5e2.5;
C: long do=0xfdaL;
D: float 2_and=1-e-3;
变量名必须由字母(a-z,A-Z)、数字(0-9)和下划线( _ )、美元符号($)中的元素组成,而且开头不能是数字。
11.设有以下定义和语句,则输出结果是(指针变量占2个字节)( A )。
struct date
{long *cat;(2字节)
struct date *next;(2字节)
double dog;(8字节)
}too;
printf(“%d”, sizeof(too));
A: 20
B: 16
C: 14
D: 12
1.结构体变量的首地址能够被其最宽基本类型成员的大小所整除。
2.结构体每个成员相对于结构体首地址的偏移量是成员本身的整数倍,如果有需要编译器会在成员之间加上填充字节。
3.结构体的总大小为结构体最宽基本类型成员大小的整数倍,如果有需要编译器会在最末成员加上填充字节。注:这里所有的对齐细节与编译器相关是因为每一个编译器有默认的对齐字节数。

12.以下for语句构成的循环执行了(c )次
#define N 2
#define M N+1
#define NUM (M+1)*M/2
main()
{int i, n=0;
for(i=1; i<=NUM; i++)
{n++;
printf("%d", n);
}
printf("\n");
}

A: 4
B: 6
C: 8
D: 9
13.设有:int a=1,b=2,c=3,d=4,m=2,n=2; 执行(m=a>b)&&(n=c>d)后n的值是( B )。A: 0
B: 2
C: 3
D: 4
因为是&&运算,所以先看前段.m=a>b,=的优
先级小于>,a>b不成立,m=0;在&&运算中,如果
出现一边为假的情况下,结果直接为假,后面的
语句不会去运算了

14.下述语句执行后,变量k的值是( B
int k=1;
while(k++<10);
A: 10
B: 11
C: 9
D: 无限循环,值不定
想要跳出循环,则k++必须是10,k++返回的是++之前的值,所以k++之后为11
k++返回的是++之前的值,++k返回的是++之后的值,比如
k=0; i=k++; 那么k为1,i为0;
k=0; i=++k; 那么k为1,i为1;

15.下面能正确进行字符串赋值操作的是( C )
A: char s[5]={“ABCDE”};
B: char s[5]={ ′A′, ′B′, ′C′, ′D′, ′E′};
C: char *s;s=“ABCDE”;
D: char *s;char a; scanf("%s",&s);
如果一个字符数组用来存储字符串,那么在定义该字符数组时,数组的大小应该比它将要实际存放的字符串长度大1,所以选项A)和B)错。选项D)e本身就是一个字符指针,不需再取地址。


版权声明:本文为qq_45731400原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。