- C语言教程
- C语言 - 首页
- C语言基础
- C语言 - 概述
- C语言 - 特性
- C语言 - 历史
- C语言 - 环境搭建
- C语言 - 程序结构
- C语言 - Hello World
- C语言 - 编译过程
- C语言 - 注释
- C语言 - 词法单元
- C语言 - 关键字
- C语言 - 标识符
- C语言 - 用户输入
- C语言 - 基本语法
- C语言 - 数据类型
- C语言 - 变量
- C语言 - 整数提升
- C语言 - 类型转换
- C语言 - 类型强制转换
- C语言 - 布尔值
- C语言中的常量和字面量
- C语言 - 常量
- C语言 - 字面量
- C语言 - 转义序列
- C语言 - 格式说明符
- C语言中的运算符
- C语言 - 运算符
- C语言 - 算术运算符
- C语言 - 关系运算符
- C语言 - 逻辑运算符
- C语言 - 位运算符
- C语言 - 赋值运算符
- C语言 - 一元运算符
- C语言 - 自增和自减运算符
- C语言 - 三元运算符
- C语言 - sizeof 运算符
- C语言 - 运算符优先级
- C语言 - 其他运算符
- C语言中的决策
- C语言 - 决策
- C语言 - if 语句
- C语言 - if...else 语句
- C语言 - 嵌套 if 语句
- C语言 - switch 语句
- C语言 - 嵌套 switch 语句
- C语言中的循环
- C语言 - 循环
- C语言 - while 循环
- C语言 - for 循环
- C语言 - do...while 循环
- C语言 - 嵌套循环
- C语言 - 死循环
- C语言 - break 语句
- C语言 - continue 语句
- C语言 - goto 语句
- C语言中的函数
- C语言 - 函数
- C语言 - 主函数
- C语言 - 按值调用函数
- C语言 - 按引用调用函数
- C语言 - 嵌套函数
- C语言 - 可变参数函数
- C语言 - 用户自定义函数
- C语言 - 回调函数
- C语言 - return 语句
- C语言 - 递归
- C语言中的作用域规则
- C语言 - 作用域规则
- C语言 - 静态变量
- C语言 - 全局变量
- C语言中的数组
- C语言 - 数组
- C语言 - 数组的特性
- C语言 - 多维数组
- C语言 - 将数组传递给函数
- C语言 - 从函数返回数组
- C语言 - 变长数组
- C语言中的指针
- C语言 - 指针
- C语言 - 指针和数组
- C语言 - 指针的应用
- C语言 - 指针运算
- C语言 - 指针数组
- C语言 - 指向指针的指针
- C语言 - 将指针传递给函数
- C语言 - 从函数返回指针
- C语言 - 函数指针
- C语言 - 指向数组的指针
- C语言 - 指向结构体的指针
- C语言 - 指针链
- C语言 - 指针与数组的区别
- C语言 - 字符指针和函数
- C语言 - NULL 指针
- C语言 - void 指针
- C语言 - 野指针
- C语言 - 解引用指针
- C语言 - 近指针、远指针和巨大指针
- C语言 - 指针数组的初始化
- C语言 - 指针与多维数组的区别
- C语言中的字符串
- C语言 - 字符串
- C语言 - 字符串数组
- C语言 - 特殊字符
- C语言中的结构体和联合体
- C语言 - 结构体
- C语言 - 结构体和函数
- C语言 - 结构体数组
- C语言 - 自引用结构体
- C语言 - 查找表
- C语言 - 点 (.) 运算符
- C语言 - 枚举 (enum)
- C语言 - 结构体填充和压缩
- C语言 - 嵌套结构体
- C语言 - 匿名结构体和联合体
- C语言 - 联合体
- C语言 - 位域
- C语言 - typedef
- C语言中的文件处理
- C语言 - 输入 & 输出
- C语言 - 文件I/O (文件处理)
- C语言预处理器
- C语言 - 预处理器
- C语言 - 预处理指令
- C语言 - 预处理器运算符
- C语言 - 宏
- C语言 - 头文件
- C语言中的内存管理
- C语言 - 内存管理
- C语言 - 内存地址
- C语言 - 存储类
- 其他主题
- C语言 - 错误处理
- C语言 - 可变参数
- C语言 - 命令执行
- C语言 - 数学函数
- C语言 - static 关键字
- C语言 - 随机数生成
- C语言 - 命令行参数
- C语言资源
- C语言 - 问答
- C语言 - 快速指南
- C语言 - 速查表
- C语言 - 有用资源
- C语言 - 讨论
C语言面试题
尊敬的读者,这些C语言面试题是专门为了让您熟悉在C语言面试中可能遇到的问题类型而设计的。根据我的经验,优秀的 interviewers 很少会在面试前计划好要问哪些具体问题,通常问题会从该主题的一些基本概念开始,然后根据进一步的讨论和您的回答继续下去。
最常问的100个C语言面试题及答案
这里列出了100个最常问的C语言面试题及其详细答案。无论您是应届毕业生还是经验丰富的开发者,这些问题都将帮助您准备面试。
什么是指向指针的指针?
它是一个指针变量,可以保存另一个指针变量的地址。它进行两次解引用来指向指定指针变量保存的数据。
Eg: int x = 5, *p=&x, **q=&p;
因此,可以通过**q访问'x'。
区分malloc()和calloc()内存分配。
两者都从堆区/动态内存分配内存。calloc 默认会将分配的内存填充为0。
auto关键字的作用是什么?
默认情况下,函数的每个局部变量都是自动的 (auto)。在下面的函数中,变量'i'和'j'都是自动变量。
void f() { int i; auto int j; }
注意 - 全局变量不能是自动变量。
break关键字可以出现在哪些有效位置?
break只能出现在循环控制和switch语句中。break 的目的是将控制权从这些块中带出来。
解释for循环的语法。
for(expression-1;expression-2;expression-3) { //set of statements }
当控制到达时,首先执行表达式-1。然后是表达式-2,如果表达式-2计算结果为非零,则执行'语句集',然后执行表达式-3,然后再次执行表达式-2。
使用尖括号< >和双引号" "包含头文件有什么区别?
如果头文件包含在< >中,则编译器只在内置包含路径中搜索特定头文件。如果头文件包含在" "中,则编译器首先在当前工作目录中搜索特定头文件,如果找不到,则在内置包含路径中搜索。
负整数是如何存储的?
获取相同正整数的二进制补码。例如:1011 (-5)
步骤1 - 5的反码:1010
步骤2 - 向上加1,得到1011,即-5
什么是静态变量?
静态局部变量在函数调用之间保留其值,默认值为0。如果该函数被调用三次,则下面的函数将打印1 2 3。
void f() { static int i; ++i; printf("%d ",i); }
如果全局变量是静态的,则它的可见性仅限于相同的源代码。
什么是NULL指针?
指向空值的指针称为NULL指针。例如:char *p=NULL;
extern存储说明符的用途是什么?
用于解析全局符号的作用域。
Eg: main() { extern int i; Printf("%d",i); } int i = 20;
解释sprintf()函数的用途。
将格式化的输出打印到字符数组中。
数组的基地址是什么意思?
数组的起始地址称为数组的基地址。
何时应该使用register存储说明符?
如果一个变量最频繁地使用,那么它应该使用register存储说明符声明,然后编译器可能会为其存储分配CPU寄存器以加快变量查找速度。
S++或S = S+1,哪个推荐用于将值加1,为什么?
S++,因为它内部是单个机器指令(INC)。
什么是野指针?
一个指针最初持有有效地址,但随后该地址被释放或释放。然后这样的指针被称为野指针。
typedef关键字的用途是什么?
它用于为现有类型创建别名。也用于简化类型的复杂声明。
什么是左值和右值?
赋值运算符右侧的表达式称为右值。右值赋给左值,左值出现在赋值运算符的左侧。左值应该指定给变量而不是常量。
实际参数和形式参数有什么区别?
在调用端发送给函数的参数称为实际参数,而在函数定义的接收端称为形式参数。
程序可以不带main()函数编译吗?
可以,但是不能执行,因为执行需要main()函数定义。
声明void指针有什么好处?
当我们不知道指针变量将保存哪种类型的内存地址时,我们就为此声明一个void指针。
自动变量存储在哪里?
每个局部变量默认都是自动变量,存储在堆栈内存中。
什么是嵌套结构体?
包含另一个结构体的元素作为其成员的结构体被称为嵌套结构体。
变量声明和变量定义有什么区别?
声明将类型与变量关联起来,而定义为变量赋予值。
什么是自引用结构体?
包含相同结构体指针变量作为其元素的结构体称为自引用结构体。
内置头文件是否包含内置函数定义?
不,头文件只声明函数。定义在库中,由链接器链接。
解释模块化编程。
将程序划分为子程序(模块/函数)以实现给定任务是模块化方法。更通用的函数定义赋予了函数重用的能力,例如内置库函数。
什么是词法单元?
C程序由各种词法单元组成,词法单元是关键字、标识符、常量、字符串文字或符号。
什么是预处理器?
预处理器是编译器指令,用于在实际编译过程开始之前执行某些操作。
解释关于scanf()的%i格式说明符的用法。
可用于输入所有受支持格式的整数。
如何使用printf()系列函数中的任何一个打印\(反斜杠)?
使用\(反斜杠)转义它。
switch语句中的default case是否需要break?
是的,如果它不是最后一个case,并且我们不希望控制流在default之后流向任何后续的case。
何时使用->(箭头)运算符?
如果结构体/联合体变量是指针变量,则要访问结构体/联合体元素,需要使用箭头运算符。
什么是位域?
除了非标准大小外,我们可以使用位域创建不同大小的整型结构成员。这种结构的大小会自动调整为机器整数大小的倍数。
什么是命令行参数?
在执行程序时传递给main()函数的参数称为命令行参数。这些参数始终是字符串,保存在函数的第二个参数(如下所示的args)中,该参数是字符指针数组。第一个参数表示参数的数量(如下所示的count),并由操作系统自动更新。
main( int count, char *args[]) { }
向函数传递参数的不同方法有哪些?什么时候使用哪种方法?
值传递 - 我们只将值作为参数发送给函数。如果我们不希望实际参数被形式参数修改,而只是使用它们,则选择此方法。
引用传递 - 我们发送实际参数的地址而不是值。如果我们希望实际参数被形式参数修改,则选择此方法。
内置函数stricmp()的用途是什么?
它比较两个字符串,忽略大小写。
描述文件打开模式“w+”。
以读写方式打开文件。如果文件不存在,则创建一个;如果文件存在,则将被覆盖。
地址运算符(&)不能在哪里使用?
它不能用于常量。
它不能用于使用register存储类声明的变量。
FILE是内置数据类型吗?
不是,它是在stdio.h中定义的结构体。5.0 % 2的余数是多少?
错误,模运算符(%)的任何一个操作数都不能是实数。
三元运算符类别下有多少个运算符?
只有一个运算符,即条件运算符(? :)。
哪个关键字用于执行无条件跳转?
goto
什么是指向函数的指针?给出其通用语法。
保存函数引用的指针称为指向函数的指针。通常声明如下。
T (*fun_ptr) (T1,T2…); Where T is any date type.
一旦fun_ptr引用了一个函数,就可以使用该指针调用该函数,如下所示。
fun_ptr(); [Or] (*fun_ptr)();
解释逗号运算符(,)的用法。
逗号运算符可以用来分隔两个或多个表达式。
Eg: printf("hi") , printf("Hello");
什么是空语句?
空语句是没有可执行语句的语句,例如;(分号)。
Eg: int count = 0; while( ++count<=10 ) ;
以上语句什么也不做,重复10次。
什么是静态函数?
在函数定义前加上static关键字,称为静态函数。如果函数只应在同一个源代码文件中调用,则应将其声明为静态函数。
使用gcc编译器编译使用math库的程序时,应使用哪个编译器开关?
使用选项 –lm,例如:> gcc –lm <file.c>
哪个运算符用于在下一行继续宏的定义?
使用反斜杠(\)。
E.g. #define MESSAGE "Hi, \ Welcome to C"
哪个运算符用于接收函数的可变数量的参数?
省略号(…)用于此目的。一般的函数定义如下所示
void f(int k,…) { }
以下代码片段有什么问题?
char *s1 = "hello",*s2 = "welcome"; strcat(s1,s2);
s1指向一个字符串常量,不能修改。
哪个内置库函数可以用来调整已分配的动态内存的大小?
realloc().
定义数组。
数组是具有相同名称的相似数据项的集合。
什么是枚举?
枚举是用名称表示的整数常量列表。枚举器用关键字enum定义。
哪个内置函数可以用来在内部移动文件指针?
fseek()
什么是变量?
变量是名称存储。
谁设计了C编程语言?
Dennis M. Ritchie。
C是哪种编程语言的继承者?
B
ANSI的全称是什么?
美国国家标准学会 (American National Standards Institute)。
哪个运算符可以用来确定数据类型或变量的大小?
sizeof
可以将浮点型变量赋值给长整型变量吗?
可以,但会丢失小数部分。
068是有效的八进制数吗?
不是,它包含无效的八进制数字。
如果关系运算符返回任何值,它的返回值是什么?
如果表达式之间的关系为真,则返回1,否则返回0。
按位异或运算符是如何工作的?
如果对应的位相同,则结果为0,否则为1。
什么是无限循环?
循环表达式始终计算为真,从而导致循环重复执行,例如:
while(0 == 0) { }
属于不同作用域的变量可以具有相同的名称吗?如果是,请举例说明。
属于不同作用域的变量可以具有相同的名称,如下面的代码片段所示。
int var; void f() { int var; } main() { int var; }
局部变量和全局变量的默认值是什么?
局部变量获得垃圾值,全局变量默认值为0。
指针可以访问数组吗?
指针通过保存数组的基地址可以访问数组。
指针上有哪些有效的运算?
指针上仅允许的两个运算为:
- 比较
- 加法/减法(不包括空指针)
什么是字符串长度?
它是字符的数量,不包括‘\0’字符。
哪个内置函数可以将一个字符串附加到另一个字符串?
strcat(),来自头文件string.h
如果联合变量是指针变量,可以使用哪个运算符访问联合元素?
箭头 (->) 运算符。
解释“stdin”。
stdin 是一个指针变量,默认情况下打开标准输入设备。
命名一个可以用来关闭文件流的函数。
fclose()。
预处理器#undef的用途是什么?
它用于取消已存在的宏定义。
定义结构体。
可以定义一个包含异构数据项集合的结构体。
命名一个预定义的宏,用于确定编译器是否符合ANSI标准?
__STDC__
什么是类型转换?
类型转换是将变量/常量从一种类型转换为另一种类型的方法。
什么是递归?
函数自己调用自己称为递归。
哪个函数可以用来释放动态分配的内存?
free()。
关于命令行参数,参数向量中的第一个字符串是什么?
程序名称。
如何使用fopen()函数确定文件是否已成功打开?
如果失败,fopen()返回NULL,否则表示成功打开。
链接器生成的输出文件是什么?
链接器生成可执行文件。
标识符的最大长度是多少?
理想情况下是32个字符,也取决于实现。
默认的函数调用方法是什么?
默认情况下,函数按值调用。
函数必须声明,也应该声明。对此发表评论。
如果在函数定义后调用函数,则函数声明是可选的。
宏何时展开?
在预处理阶段。
函数可以使用return保留字向调用者返回多个值吗?
不能,只能向调用者返回一个值。
什么是常量指针?
不允许在指针持有地址后更改其地址的指针。
要使指针对哪种数据类型具有通用性,需要如何声明它?
void
结构体变量可以在声明时立即初始化吗?
可以,仅限于结构体元素的顺序。
有没有办法比较两个结构体变量?
没有这种方法。我们需要逐个比较结构体变量的元素。
哪个内置库函数可以用来从字符串中匹配模式?
strstr()
远指针和近指针有什么区别?
首先,它们是非标准关键字。近指针只能访问2^15个内存空间,而远指针可以访问2^32个内存空间。这两个关键字都是实现特定的,是非标准的。
我们可以在C代码中嵌套注释吗?
不能。
如果必须执行一组语句固定次数,建议使用哪个控制循环?
for循环。
什么是常量?
不能修改的值称为常量。此类变量用关键字const限定。
我们可以只使用结构体的标签名来声明相同的变量吗?
不可以,我们需要同时使用关键字'struct'和标签名。
main()函数可以留空吗?
可以,程序可能什么也不做。
一个函数可以调用另一个函数吗?
可以,任何用户定义的函数都可以调用任何函数。
除了Dennis Ritchie,还有谁参与了C语言的设计?
Brian Kernighan
接下来是什么?
接下来,你可以回顾一下你之前在这个科目上完成的作业,确保你能自信地谈论它们。如果你刚毕业,面试官不会期望你回答非常复杂的问题,而是要确保你的基础概念非常扎实。
其次,如果你无法回答一些问题,其实并不重要,重要的是你回答的任何问题都必须充满自信。所以在面试时要自信。Tutorialspoint祝你找到一位好的面试官,并祝你未来的努力一切顺利!干杯 :-)