2022年度C语言面试题库汇编(含完整答案)

本文整理了2022年C语言面试中常见的问题和答案,包括变量声明与定义的区别、全局变量与静态全局变量的差异、存储类与链接类型、const和volatile关键字的使用、数据类型、指针操作、内存管理和函数指针等核心概念。通过深入探讨这些主题,帮助求职者和开发者更好地理解和掌握C语言的基础和高级特性。
摘要由CSDN通过智能技术生成

1、变量的声明和定义有什么区别?
在C语言中声明变量:变量声明仅在编译时向编译器提供以给定类型和名称存在的变量的确定性,以便编译器继续进行进一步编译,而不需要该变量的所有细节。 在 C 语言中,当我们声明一个变量时,我们只将信息提供给编译器,但没有为它保留内存。 它只是一个引用,通过它我们只向编译器保证这个变量可以定义在函数内部或函数外部。 注意:我们可以多次声明一个变量,但只定义一次。 例如: extern int data; extern int foo(int, int); int fun(int, char); //
2、全局变量和静态全局变量有什么区别?
全局变量和静态全局变量有不同的联系。 这就是全局变量可以在文件外部访问但静态全局变量只能在声明它的文件内访问的原因。 静态全局变量 ===>>> 内部链接。 非静态全局变量 ===>>> 外部链接。
3、C语言中的存储类是什么?
存储类决定程序中变量或函数的范围(生命周期)和范围(可见性)。 每个变量都在内存中的某个位置以位的形式存储变量的值。 存储类决定这些变量值将存储在 CPU 寄存器、堆栈内存、BSS 或 DS 中的位置。 C语言编程中有四种可用的存储类,它们如下: autostaticexternregister
4、内部静态变量和外部静态变量的区别是什么?
在C语言中,外部静态变量有内部链接,内部静态变量没有链接。 这就是它们具有不同范围但两者都将在整个程序中存活的原因。 外部静态变量 ===>>> 内部链接。 内部静态变量 ===>>> 无。
5、typedef和宏有什么区别?
让我们先来看一下 typedef 和宏的简短描述,以了解它们之间的区别。 typedefC语言提供了一个非常重要的关键字 typedef,用于为现有类型定义新名称。 typedef 是编译器指令,主要与用户定义的数据类型(结构、联合或枚举)一起使用,以降低它们的复杂性并增加代码的可读性和可移植性。 语法: typedef type NewTypeName; 示例: typedef unsigned int UnsignedInt; 现在 UnsignedInt 是一个新类型,就可以使用它来创
6、以下 C 代码的输出是什么?
#include<stdio.h>
int main()
{
typedef auto int myAutoInt;
myAutoInt data = 4;
printf(“%d”,data);
return 0;
}
C
编译器错误。 解释:typedef 已被视为部分存储类,因此不能一次混合两个存储类。
7、C语言中的变量是什么?
C语言中的变量定义了一个位置名称,可以在其中放置值,并且可以在程序中需要时使用这些值。 换句话说,可以说变量是一个名称(或标识符),它指示内存中的某个物理地址,其中数据以字符串位的形式存储。 在C语言中,每个变量都有特定的数据类型(预定义的或用户定义的),这些数据类型决定了变量的大小和内存布局。 注意:每个变量都绑定了两个重要的属性,范围和范围。
8、使用变量 p 写出下一些声明:
1、一个整数变量。
2、五个整数的数组。
3、指向整数的指针。
4、一个由十个指向整数的指针组成的数组。
5、指向整数的指针。
6、指向三个整数数组的指针。
7、一个指向函数的指针,它将指向字符的指针作为参数并返回一个整数。
8、一个由五个指针组成的数组,指向接受一个整数参数并返回一个整数的函数。
变量 p 对应的声明如下: 1. int p; // An integer 2. int p[5]; // An array of 5 integers 3. int *p; // A pointer to an integer 4. int *p[10]; // An array of 10 pointers to integers 5. int **p; // A pointer to a pointer to an integer 6. int (*p)[3]; // A pointer
9、C语言有哪些数据类型?
数据类型是数据的分类,它告诉编译器或解释器程序员打算如何使用数据。 换句话说,您可以说它定义了变量的大小(BYTE)和范围。C语言中数据类型的分类:1、预定义数据类型(int、char、float等)2、用户定义的数据类型(struct、union、enum) 在 C 语言中,不同的数据类型有不同的范围。 范围因编译器而异。 在下表中,根据 32 位 GCC 编译器列出了一些具有范围和格式说明符的数据类型。 数据类型 Memory (bytes) 范围
10、关键字 static 的用途是什么?
在 C 语言中,static 关键字非常重要。 如果在变量或函数中使用了 static 关键字,那么只有内部链接或无链接有效。1、静态变量只初始化一次,因此在函数体内声明为静态的变量在函数调用之间保持其先前值。2、带有static关键字的全局变量具有内部链接,因此只能在翻译单元(.c)内访问。 其他翻译单元无法访问它。 static 关键字保护变量从另一个编译单元访问。3、默认情况下,在 C 语言中,函数的链接是外部的,它可以被同一个或另一个翻译单元访问。 在 static 关键字的帮助下,可以
11、有哪些不同类型的链接?
C语言有3种链接,外部链接、内部链接和无链接。
12、静态变量可以在头文件中声明吗?
可以,我们可以在头文件中声明静态变量。
13、C语言中整数的大小取决于什么?
C标准解释了整数的最小大小应该是 16 位。 一些编程语言解释说整数的大小取决于实现,但可移植程序不应该依赖它。整数的大小主要取决于编译器编写者为底层处理器编写的编译器类型。可以看到编译器根据便利性和底层架构愉快地改变整数的大小。 因此,建议使用 C99 整数数据类型(uin8_t、uin16_t、uin32_t …)代替标准 int。
14、整数是有符号的还是无符号的?
在标准 C 语言中,整数数据类型默认是有符号的。 所以如果创建一个整数变量,它可以存储正值和负值。
15、C中的无符号整数和有符号整数有什么区别?
有符号和无符号整数类型具有相同的存储(根据标准至少 16 位)和对齐方式,但它们仍然存在很多差异,在下面的行中,描述有符号和无符号整数之间的一些差异。 有符号整数可以同时存储正值和负值,但在它旁边无符号整数只能存储正值。有符号整数类型的非负值范围是相应无符号整数类型的子范围。例如: 假设整数的大小为 2 个字节。有符号整数 -32768 到 +32767无符号整数 0 到 65535 在计算无符号整数时,它永远不会溢出,因为如果计算结果大于无符号整数类型的最大值,则它会以比结果类型可以表示的
16、宏和函数有什么区别?
宏和函数的区别如下所示:
17、以下 C 代码的输出是什么?
#include <stdio.h>
#define PRINT(var,data) do {
if(var < data)
{
printf(“Aticleworld”);
++var;
}
}while(1);
int main()
{
PRINT(0,2);
return 0;
}
C
输出:编译器错误。说明: 扩展宏时,var 将被替换为 0(Rvalue)。 因为正在尝试增加 Rvalue,所以将收到编译器错误。
18、C语言中的枚举是什么?
C语言中的枚举是用户定义的数据类型。 它由一组命名的常量整数组成。 使用 enum 关键字,我们可以通过使用枚举标签(可选)和命名整数列表来声明枚举类型。基本上,我们使用枚举来增加代码的可读性,并且与符号常量(宏)相比,使用枚举更容易调试代码。 enum 最重要的属性是它遵循范围规则,编译器会自动将值分配给它的成员常量。 注意:枚举类型的变量存储由该类型定义的枚举列表的值之一。 enum 的语法如下: enum Enumeration_Tag { Enumeration_List }; E
19、关键字 const 是什么?
const 限定符仅向编译器指示无法更改限定对象的值。 简单来说, const 表示不可修改(不能在运行时给对象赋值)。 语法: const DataType Identifier = Value; e.g. const int iData = 0;
20、什么时候应该在C程序中使用 const?
在程序中有以下地方需要使用 const 关键字: 在引用函数参数调用中,如果不想更改已传入函数的实际值。 int PrintData ( const char *pcMessage); 在某些地方, const 比宏更好,因为 const 由编译器处理并且具有类型检查。 const int ciData = 100; 对于 I/O 和内存映射寄存器,const 与 volatile 限定符一起使用以实现高效访问。 const volatile uint32_t *DEVICE_STATUS
21、以下代码声明的含义是什么&

一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.CPU要访问的某一存储单元的实际地址称(   )   A.段地址         B.偏移地址   C.物理地址        D.逻辑地址 2.某存储单元的物理地址是12345H,可以作为它的段地址有(   )   A.2345H        B.12345H   C.12340H       D.1234H 3.执行后使BX=0的同时也使CF=0,OF=0的指令是(   )   A.XOR BX,BX    B.OR BX,BX   C.AND BX,BX    D.CMP BX,BX 4.循环控制指令LoopNZ/LoopNE控制循环继续执行的条件是(   )   A.CX≠0且ZF=1    B.CX≠0且ZF=0   C.CX≠0或ZF=1    D.CX≠0或ZF=0 5.在执行DAA指令,当高四位BCD码校正时产生进位,如要把此进位值送入AH中,对这进位值的操作应是(   )   A.DAA校正指令的功能已自动加在AH中   B.进位值在AF中,校正后根据AF内容再加在AH中   C.进位值在CF中,校正后根据CF内容再加在AH中   D.进位值在AL最高位上,校正后根据AL最高位内容再加在AH中 6.AND,OR,XOR,NOT为四条逻辑运算指令,下面的解释正确的是(   )   A.指令XOR AX,AX执行后,AX内容不变,但设置了标志位   B.指令OR DX,1000H执行后,将DX最高位置1,其余各位置0   C.指令AND AX,OFH执行后,分离出AL低四位   D.NOT AX,执行后,将AX清0 7.在执行下列指令时,需要使用段寄存器DS的指令是(   )   A.STOSW        B.ADD AL,CL   C.NEG BX       D.INC DA[BX] 8.无论BH中原有的数是奇数或偶数,若要使BH中的数一定为奇数,应执行的指令是(   )   A.ADD BH,01H     B.OR BH,01H   C.XOR BH,01H     D.TEST BH,01H 9.完成对CL寄存器的内容乘以4的正确操作是(   )   A.ROL CL,1        B.MUL 4     ROL CL,1   C.SHL CL,1        D.MOV CL,2    SHL CL,1             SHL CL,CL 10.下面各传送指令中,正确的是(   )   A.MOV [DI],[SI]            B.MOV[DX+DI],AL   C.MOV WORD PTR [BX],0100H       D.MOV AL,BX 11.汇编语言语句格式中对名字项的规定如下,请找出其中错误的说法(   )   A.名字的第一个字符可以是大写英文字母及小写英文字母   B.名字的第一个字符可以是字母、数字及、@、_   C.名字的有效长度≤31个字符   D.在名字中不允许出现$ 12.要实现使BETA的值为56,应采用语句为(   )   A.BETA DB 56      B.BETA DB 56H   C.BETA EQU 56      D.BETA EQU 56H 13.REPZ CMPSW指令,重复执行的终止条件是(   )   A.CX=0或ZF=0      B.CX=0且ZF=0   C.CX=0或ZF=1      D.CX=0且ZF=1 14.下面程序段执行后,AL中的内容是(   )   MOV AX,8833H   ADD AL,AH   DAA   A.21       B.21H   C.0C1H      D.0DDH 15.比较两个带符号的数A、B,当A=B时程序转移,测试的条件为(   )   A.ZF=1      B.ZF=0   C.SF=1      D.SF=0 16.检查二个无符号数的关系,若要实现AL≥BL时分支去LOP1处,那么在“CMP AL,BL”指令后应跟的分支指令是(   )   A.JNC LOP1      B.JA  LOP1   C.JC LOP1      D.JGE  LOP1 17.在下列串操作指令中,同时使用源串和目的串地址指针的指令是(   )   A.STOSW      B.LODSW   C.SCASW      D.CMPSW 18.设AL=0AH,下列指令执行后能使AL=05H的是(   )   A.NOT AL         B.AND AL,0FH   C.XOR AL,0FH      D.OR AL,0FH19.DA1  DW‘AB’,‘CD’,‘EF’,‘GH’(   )     ┇    MOV AX,DA1+3  指令执行后AX中的内容是  A.‘EF’   B.‘CD’  C.‘BC’   D.‘FC’20.使用DOS系统功能调用时,使用的软中断指令是(   )  A.INT 21      B.INT 10H  C.INT 16H     D.INT 21H二、填空题(本大题共12空,每空0.5分,共6分)请在每小题的空格中填上正确答案。错填、不填均无分。21.十六进制数0FFF8H表示的十进制正数为________,表示的十进制负数为________。22.若DS=0F3EH,SI=2000H,COUNT=0A8H,指令MOV AX,(SI+COUNT)中,源操作数的有效地址EA为________,其物理地址为________。23.CPU的标志寄存器中标志位,可以分为两大类,其中一类称为________标志位,另一类称为________标志位。24.当标志位________=1时表示无符号数运算产生溢出,而当标志位________=1是表示带符号数运算产生溢出。25.如JMP指令采用段间间接寻址,那么由4个相邻字节单元中存放有转移地址,其中前两个字节存放的是________,而后两个字节存放的是________。26.在串操作程序中,通常在重复前缀指令REPZ或REPNZ后,选用的串操作指令是________或________才有实际意义。三、简答题(本大题共4小题,每小题2分,共8分)27.已知:BX=1357H,DI=2000H,DS=2000H,CS=4000H,分别指出下面各指令中存储器操作数的物理地址。(1)MOV AL,[BX](2)MOV CS:[BX+DI],AH28.0P1 DB 1,2 0P2 DW 3412H,5678H┇ MOV AX,OP1+1;字单元(OP1+1) AX MOV BL,OP2+1;字节单元(OP2+1) BL 上述二条传送语句有语法错误,请根据注释字段的说明,将其改正。29.下列语句在存储器中分别为变量分配多少字节? (1)AD2 DW 10 DUP(?),10 (2)AD3 DD 100 DUP(?)30.简述下面两条指令分别是什么语法错误? MOV [BX],[SI] MOV AX,DL四、程序分析题(本大题共6小题,每小题6分,共36分)31. MOV DL,AL   NOT DL   TEST DL,04H   JE NEXT        ┇ NEXT:…   若上述程序段执行时产生分支,说明AL中的数第几位一定为1?程序段执行后CF是多少?32.DA1  DB‘ABCDEFGHI’  DA2  DB  9 DUP(0)    ┇    LEA SI,DA1    LEA DI,DA2    MOV CX,9    CLD  LOP: LODSB    SUB AL,10H    STOSB    LOOP LOP    . . . 试问:①写出程序执行后DA2各字节中的数据。   ②保持程序功能情况下,程序中 可否改写为 33.已知:BX=4567H   NEG BX   INC BX   NEG BX   DEC BX 程序段执行后,BX=________,CF=________。34.   MOV BL,64H     MOV CL,03H     XOR AX,AX AGAIN:ADD AL,BL    ADC AH,0    DEC CL    JNZ AGAIN 问:(1)该程序段完成的功能是:   (2)AX=________。35.已知数据段中定义 DAT1 DB  12H,34H,56H,78H    MOV CX,0    MOV AX,WORD PTR DAT1    MOV CL,DAT1+3 当程序段执行完后AX=________,CX=________。36.DA1  DB 83H,72H,61H,94H,5AH    ┇     MOV CX,WORD PTR DA1     AND CX,0FH     MOV AL,DA1+3     SHL AL,CL  上述指令序列执行后,AL=_______,CL=_______。五、程序填空题(本大题共2小题,每小题6分,共12分)37.在NUMW单元存放有一个0-65535范围内的整数,将该数除以500,商和余数分别存入QU1和REM单元,请在空行处各填上一条指令完善该程序。   ┇ MOV AX,NUMW _____________ XOR DX,DX DIV BX MOV QUI,AX  _____________38.某程序欲用单个字符显示的2号功能调用去显示STRING中的字符串‘COMPUTER’(不显示字符‘$’!).试在空白处填上适当的一条指令。 STRING DB‘COMPUTER’,‘$’ ┇ MOV BX,0FFSET STRING LOP:MOV DL,[BX]    MOV AH,02H    INT 21H    ____________________    ____________________    JNE LOP六、编程序题(本大题共2小题,第39小题6分,第40小题12分,共18分)39.试编制一程序段,用串操作指令实现以DA_BY为首址的20H个字节单元中存放相同字符‘Y’(设DA_BY存储区已有ES指向)。40.试编制一源程序,统计DA1字单元中0的个数,如统计的个数为奇数,则将进位位置1,否则进位位清0。    DATA  SEGMENT    DA1  DW  XXXX    DATA ENDS2006年10月汇编语言程序设计试题答案  来源: http://www.csai.cn 2006年10月汇编语言程序设计试题答案一、1、C;2、D;3、A;4、B;5、C;6、C;7、D;8、B;9、C;10、C;11、B;12、C;13、A;14、B;15、A16、C;17、D;18、C;19、D;20、B二、21、+65528;-3276022、20A8H;11488H23、状态;控制24、CF;OF25、IP;CS26、STOS;CMP三、27、(1)21357H;(2)43357H28、MOV AX,WORD PTR(OP1+1)    MOV BL,BYTE PTR(OP2+1)29、(1)22;(2)40030、MOV指令不能在两个存储器操作数之间进行;    操作数类型不匹配四、31、第2位;CF=032、123456789;不能更改33、BX=4565H;CF=134、AX=012CH,将AX内容乘3送BX中35、AX=3412H,CX=0078H36、AL=0A0H,CL=03H五、37、MOV BX,500    MOV REM,DX38、INC BX    CMP [BX],24H六、39、LEA DI,DA_BY        MOV CX,32        MOV AL,‘Y’        CLD        REP STOSB40、CODE SEGMENT          ASSUME CS:CODE,DS:DATA       START: MOV  AX,DATA              MOV  DS,AX              LEA  SI,DA1              MOV  CX,16              XOR BL,BL       AGAIN: MOV  AL,[SI]              HL AL,1              JC NEXT              INC BL        NEXT:INC SI              LOOP AGAIN              TEST BL,01H              JNE  L1              CLC              JMP DONE           L1: STC         DONE: MOV AH,4CH               INT 21H         CODE ENDS              END START  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海澜明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值