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祝你找到一位好的面试官,并祝你未来的努力一切顺利!干杯 :-)

cprogramming_questions_answers.htm
广告