尽管已经有将近 50 年的历史,但 C 仍然从最前沿引领着编程领域。该编程语言不仅具有广泛的应用程序,而且还是各种现代、强大的编程语言(如Java、C# 和 Python)的灵感来源。
C语言常见面试题有哪些?尽管如今很少有工作只需要精通 C 语言,但大多数编程工作都需要对 C 编程语言的基本概念有很好的理解。因此,许多编程工作面试都涉及 C 面试问题和答案。
最佳C语言面试题和答案合集
如果你正在准备 C 编程面试问题,那么你来对地方了。这里有 40 多个最佳 C 面试问题,可帮助你开始面试或简单地自我评估你对通用程序编程语言的掌握程度:
初级面试问题
问题:列出 C 编程语言的一些最重要的特性。
答:C 支持大量强大的功能。其中最重要的是:
- 可扩展性- 能够采用新功能。
- 快速- 与Java 和 Python等流行的高级语言相比,对系统编程的支持允许更快的编译和执行。
- 内存管理- 带有内置内存管理,用于节省内存和优化内存使用。
- 中级编程语言- 弥补了机器级语言和高级语言之间的差距。它可用于系统编程以及应用程序编程。
- 平台独立性/可移植性- 为一台机器编写的 AC 程序可以在其他机器上运行,几乎不需要修改。
- 简单- 遵循结构化方法。有助于将大型复杂程序分解为更小、独立且易于管理的模块(子程序)。
问题:请解释什么是 C 中的头文件?如果我们在 C 程序中包含两次头文件会发生什么?
答:头文件存储了定义和管理 C 编程语言不同内置函数的规则集。例如, printf() 和 scanf() 函数在 stdio.h 头文件中定义。
每个头文件都包含一组预定义的函数,旨在使 C 编程更简单。你需要在 C 程序中包含特定的头文件才能使用其中定义的函数。例如,你不能在不包含 stdio.h 头文件的情况下使用 printf() 和 scanf() 函数。
当一个头文件在 C 程序中包含两次时,第二个将被忽略。实际上,头文件前面的#,称为包含保护,确保它在编译过程中只包含一次。
问题:你对 C 语言了解多少,它是谁发明的,什么时候发明的?
答: C 语言是最常用的计算机编程语言之一。该语言是通过给出分步说明来使用的,这使其成为一种过程语言。它是一种广泛使用的语言,有助于执行系统编程、词法变量作用域和循环。C 语言是最流行的语言之一,起源于 1970 年代初的美国。它由贝尔实验室的美国计算机科学家 Dennis M. Ritchie 开发。从那时起,它以最好的方式为人类服务,并帮助开发了多个系统应用程序。
问题:为什么C语言被称为“编程语言之母”?
答: C 语言通常被称为“编程语言之母”,因为它是构成编程基础的语言。它是一种历史悠久的语言,已广泛用于开发一些最重要的编译器和内核。C语言与山一样古老,大多数现代语言只不过是对C语言的改编。
问题:与其他编程语言相比,使用 C 语言有什么优势?
答: C 语言相对于其他编程语言具有优势,这无疑使其成为“编程语言之母”。使用 C 语言的一些好处如下所述:
中级语言:由于C语言处于高级语言和低级语言的中间,它汇集了两者的特点。因此,该语言的这一显着特征使其既可用于低级编程,也可用于高级编程。
- 结构化级别语言: C 语言是一种结构化编程语言,它允许将复杂的程序划分为称为函数的更简单的程序。从而使其非常用户友好。
- 区分大小写的语言:这是一种区分大小写的语言,因此区分大小写字母。
- 可移植语言: C 语言是一种高度灵活的语言,使其能够用于脚本系统应用程序,这使其成为许多知名操作系统的一部分。
- 强大高效的语言:它是一种用户友好的语言,可以有效地操作游戏、图形、企业应用程序、需要一些计算的应用程序等。
问:C语言有哪些局限性?
答:万物皆有可能,C语言也不例外。以下是C语言的一些缺点:
- OOPs的概念: C 语言禁止 OOPs 的概念,因为它基于过程方法。(继承、多态、封装、抽象、数据隐藏)。
- 运行时检查: C 语言不做运行检查,也就是说每行代码都不会检测到错误,而是只在一次完整的编码完成后,不便更正错误
- Namespace的概念: C语言不具备Namespace的特性,所以C语言程序中不能有两个同名的变量。
- 缺乏异常处理:该语言没有表现出异常处理的重要特性。异常处理的特性不允许用户在编译代码时检测错误和错误。
- 抽象层次不足: C语言的数据处理能力不是很广,这对语言的安全性构成了威胁。
问题:C 中 main() 函数的目标是什么?
答: C语言中的main()函数是C程序的入口。它是程序执行过程开始的入口点。当 C 程序开始执行时,程序的控制权指向 main() 函数。每个C语言程序都必须有一个main()函数。虽然它是指示编程过程的函数,但它并不是要执行的第一个函数。
问题:变量和常量可以理解什么?
答:在 C 语言中,常量和变量在设计程序时都被广泛使用。主要区别在于变量之间,而常量是变量可以在程序的任何点更改其分配的值。相反,常量的值在整个程序中保持不变。常量的值在程序执行过程中被锁定。例如,pi 的值可以在整个程序过程中设置为一个常数。
问题:区分尖括号 < > 内的头文件和双引号“.
答:当头文件放在尖括号 < > 和双引号中时,会注意到很大的不同。如果头文件放在尖括号 < > 内,那么编译器只会在内置的包含路径中找到特定的头文件。但是如果头文件放在双引号中,那么编译器会尝试主要在当前工作目录中定位特定的头文件,如果在那里找不到,则在内置包含路径中搜索。
问题:没有 main() 函数的 C 程序编译成功吗?它的执行情况如何?
答:是的,即使不添加 main() 函数也可以编译 C 程序。但是,它不会在没有 main() 函数的情况下执行。
问题:枚举C 中的基本数据类型?
答:C 中有 5 种基本数据类型:
- int - 存储一个整数
- float - 存储十进制数
- double - 存储精度最高的十进制数
- char - 存储单个字符
- void - 不存储任何值
问题:C语言面试题和答案合集 - 保留关键字是什么意思?C中有多少保留关键字?
答:在编写程序时限制一般使用的词,即用作变量、函数、结构等的名称,称为保留关键字。保留关键字,也称为保留名称,具有特殊含义,即它们已经为某事定义了。C 编程语言有以下 32 个保留关键字:
- auto
- break
- case
- char
- const
- continue
- default
- do
- double
- else
- enum
- extern
- float
- for
- goto
- if
- int
- long
- register
- return
- short
- signed
- sizeof
- static
- struct
- switch
- typedef
- union
- unsigned
- void
- volatile
- while
问题:全局变量与静态变量有何不同?
回答:全局变量是具有全局作用域的变量,也就是说,它们可以在整个程序中访问,除非被隐藏。这些变量是在函数或代码块之外定义的。静态变量是静态分配的变量,即它们的值不能改变。它在程序的整个运行过程中都是固定的。它们可以在函数外部和内部定义。此外,它们可以从程序内的任何地方访问。
问题:请比较静态内存分配和动态内存分配?
答:以下是静态和动态内存分配模式之间的重要区别:
内存增加:
在动态内存分配中,可以在执行程序的同时增加内存。不是这种情况; 但是,对于静态内存分配,在程序执行期间增加内存的选项不可用。
内存要求
与动态内存分配相比,静态内存分配需要更多的内存空间。
用于
数组使用静态内存分配,而链表使用动态内存分配。
它什么时候发生?
静态内存分配发生在编译时,而动态内存分配发生在运行时。
问题:你能解释一下 C 中的内存泄漏吗?为什么要解决它?
答:当在堆中创建的内存未被删除时,就会发生内存泄漏。这会导致额外的内存使用,从而影响程序的性能。这正是必须解决内存泄漏问题的原因。
问题:请解释一下你对while(0)和while(1)的理解?
答:while(0) 表示循环条件永远为假,即while 循环内的代码不会被执行。相反,while(1) 是一个无限循环。它会持续运行,直到遇到明确提到的 break 语句。
注意:while 循环大括号内的任何非零整数都将导致无限循环。例如,while(-22) 和 while(24) 都会产生无限循环。
问题:解释保护访问说明符的作用?
答案:受保护关键字的隐私位于关键字 private 和 public 之间。如果一个类被标记为受保护的,它可以被它的成员函数、使用公共或受保护访问派生的类、私有派生类和声明这些成员的类的朋友访问。
问题:关键字 volatile 是做什么用的?
答: Volatile 会阻止编译器优化有问题的变量或对象。任何代码都可以随时更改当前代码范围之外的变量((例如,线程))值。这意味着编译器必须在变量的所有本地副本中保留 volatile 变量的值。
问题:解释“删除”运算符的用途?
答: Delete 删除所有由 new 表达式创建的对象,即释放堆空间中的内存。使用 [] 运算符删除数组对象:
delete[] array;
NULL or void Pointer can be deleted as:
delete ptr;
The same is applicable for user-defined data types as well. For example,
int *var = new int;
delete var;
问题:解释 extern 存储说明符的用途。
答: extern 存储说明符有助于声明可由许多源文件使用的对象。它描述了一个外部定义的变量。定义可以出现在块的开头或函数之外。extern 变量只有一个声明。如果找到任何其他实例,则认为它与第一个实例相同。外部变量可以具有块作用域或文件作用域,具体取决于它们的定义位置。
问题:定义预处理器。
答:预处理器是一个程序,它产生的输出被其他程序用作输入。例如,翻译是一个预处理步骤,之后代码被发送进行编译。
问题:什么是命令行参数?
答:为了从外部控制程序,我们在调用 main 方法时向程序提供命令行参数参数。语法是:
int main(int argc, char *argv[])
其中 argc, argv 是命令行参数。
问题:列出引用和指针的区别?
引用 | 指针 |
它是变量的替代名称。 | 存储变量的地址。 |
使用 * 声明:int *ptr。 | 使用 & 声明:int &refvar。 |
不能有空值。 | 可以分配空值。 |
可以通过值传递访问。 | 使用按引用传递。 |
必须在声明时初始化,即 int &ref; 会报错。 | 声明本身不需要初始化,即 int *ptr 是正确的。 |
与原始变量共享相同的内存地址并占用堆栈上的一些空间。 | 栈上有它的大小和内存地址。 |
问题:解释 C++ 中的各种 OOP 概念?
答:C语言常见面试题有哪些 - C++ 中的 OOP 概念是:
- 类(对象):类是代表某物的实体。它具有属性和功能。例如,Car 可以是具有模型、颜色、大小等的类,因为属性和函数可以是 isSecondHand() 或 isAutomatic() 等。对象是表示实际值的类的新实例。使用 new 运算符创建对象。
- 封装:所有属性和函数的绑定称为封装。例如,一个类可以封装相似对象的所有属性。
- 多态:这个概念允许通过修改重用功能。有两种类型:重载、覆盖。
- 继承:从父类获取属性和方法的类被称为继承父类。例如,Ford 是一种 Car,可以使用 Car 类的通用属性和方法。因此,它可以继承 Car 类。
- 抽象:意味着只向最终用户展示高级细节,隐藏实际的实现细节。
阅读有关OOP 概念的详细信息。
问题:编写一个程序来打印 Hello World! 不使用分号。
答: 我们可以使用不带条件的 if 语句来实现:
#include <stdio.h>
#include <conio.h>
void main()
{
if
(
printf("Hello World!")
)
}
输出:Hello World!
问题:用例子解释 C++ 中各种类型的多态性。
答:多态有两种类型,即静态和动态。方法重载是静态多态的一个例子,方法覆盖是动态多态的一个例子。
- 编译时(静态绑定):在此,我们有两个相同的函数,但参数(参数)的数量不同。根据参数的数量,编译器决定必须调用哪些函数。这种类型称为函数/运算符重载。例子:
int sum(int a, int b){ c = a+b; return c;}
int sum(int x, int y, int z){ v = x+y+z; return v;}
在主函数中,我们可以调用任何:
sum1 = sum(9,5);
sum2 = sum(9,5,3);
请注意,要调用的函数是在编译时决定的。
- 运行时(动态绑定):在这种情况下,父类和子类中都存在相同的函数。在运行时创建任一类的实例时,将调用正确的方法。因此子类用它自己的特定实现覆盖了父类中存在的函数。例子:
class A{
void run(){cout<<”I am in superclass A”;}
}
class B: public A{
void run(){cout<<”I am in subclass B”;}
}
在我们的主函数中,我们可以这样调用函数:
A a;
a.run();
B b;
b.run();
第一个调用将打印消息“I am in superclass A”,第二个调用将打印“I am in subclass B”。
问题:C++ 中的命名空间示例?
答:命名空间定义为:
namespace myNmspace
{
int a, b; //entities
}
如果要从命名空间外部访问变量 a 和 b,则必须使用作用域运算符 (::) 作为:myNmspace :: a。
如果我们想使用当前区域的命名空间,我们使用关键字 using 如下:using namespace myNmspace;
问题:举例说明指针执行的各种操作。
答:指针存储变量的地址。认为,
int x = 2;
int *y; // 指针声明-没有赋值,这被称为野生指针
y = &x; // 存储在指针y中的x的地址
这会将 x 的地址存储到 y 中。请注意,我们使用“&”符号来获取地址。
如果没有要分配的地址,我们可以将指针指向 NULL:
int *y = NULL ; // 这称为空指针
空指针用于存储任何类型变量的地址。它可以创建为:
无效*y = NULL ;
指针可用作使用“*”符号的变量值的替代。例如,
z = *y+ 1等价于 z = x+ 1。
我们可以使用指针执行相等性检查:
int *a, *b; 如果a=b,则两者都指向同一个变量。
我们可以进行递增和递减,例如y++, y-- 。
问题:请给出 new() 和 malloc() 之间的一些重要区别?
回答:
new() | malloc() |
它是一个运算符。 | 它是一个函数。 |
返回数据类型。 | 返回空指针。 |
通过构造函数使用默认值分配内存。 | 内存未初始化;默认值是垃圾。 |
新的可以重载。 | 不能超载。 |
分配不能调整大小。 | 可以使用 realloc 调整分配的大小。 |
问题:解释delete和delete[]的区别?
答: Delete 从内存中删除单个对象,而 delete[] 用于取消分配对象数组的内存。使用 delete[] 的重要性在于,如果我们有一个指向大小为 10 的数组(new myarr[10])的指针(比如 ptr)并简单地给出 delete ptr,因为我们不知道 ptr 指向多少个对象, 因此 delete 只会删除第一项。其余 9 项将不会被删除。这会导致内存泄漏。例子:
// delete
int *var = new int;
delete var;
// delete[]
int *arr = new int[1];
delete[] arr;
问题:说明前缀增量和后缀增量之间的区别。
答:在前缀递增中,变量的值在程序执行之前递增。该变量在程序执行后以后缀增量递增。
++a <- 前缀增量
a++ <- 后缀增量
中级面试题
问:请解释一下C中Dangling Pointer的概念?指针可以通过多少种方式充当悬空指针?
答:指向已删除内存位置的指针称为悬空指针。根据另一个定义,悬空指针是指向取消引用的内存位置的指针。指针在三种情况下充当悬空指针:
- 释放内存
- 当局部变量不是静态的
- 当变量超出范围时
最初,悬空指针持有一个有效的内存地址。然而,稍后,持有的地址被释放。
悬空指针问题:
当A指针指向一个内存位置,而B指针删除了A指针所占用的内存时,则A指针仍然指向该内存位置,该位置不再可用。这称为悬空指针问题。
问题:空指针与空指针有何不同?
答案: 当指针在声明时不知道其值时,它会被初始化为 NULL。通常,NULL 指针不指向有效位置。与 NULL 指针不同,void 指针是通用指针,没有任何关联的数据类型。空指针可以包含任何类型变量的地址。因此,void 指针指向的数据类型可以是任何类型。
#include <stdio.h>
#include <conio.h>
void main()
{
int a = 22;
int *notnullpointer = &a;
int *nullpointer1; // Null because there is no initialization.
int *nullpointer2 = 0; // Null because initialized with 0.
if (notnullpointer == 0) printf ("\nNot null pointer is null.");
else printf ("\nNot null pointer is not null.");
if (nullpointer1 == 0) printf ("\nNull pointer 1 is null.");
else printf ("\nNull pointer 1 is not null.");
if (nullpointer2 == 0) printf ("\nNull pointer 2 is null.");
else printf ("\nNull pointer 2 is not null.");
printf ("\nNot null pointer has stored the address %d.", ¬nullpointer);
printf ("\nNull pointer 1 has no valid address.");
printf ("\nNull pointer 2 has no valid address.");
}
输出:
Not null pointer is not null.
Null pointer 1 is null.
Null pointer 2 is null.
Not null pointer has stored the address 2054804456.
Null pointer 1 has no valid address.
Null pointer 2 has no valid address.
与 NULL 指针不同,void 指针是通用指针,没有任何关联的数据类型。空指针可以包含任何类型变量的地址。因此,void 指针指向的数据类型可以是任何类型。例如:
int x = 22;
char b = 'a';
void *vp = &x; // Here the void pointer is holding address of int x
vp = &b; // Here the void pointer is holding address of char b
问题:你怎么理解C中指针上的指针?
答案: 指针上的指针是包含其他某个指针地址的指针。它是多个间接引用的一种形式。第一个指针包含第二个指针的地址,第二个指针指向实际值的位置。
问题:请解释 calloc() 和 malloc() 函数?
答: calloc() 和 malloc() 是用于动态分配内存的库函数,即运行时从堆段分配内存。如果内存分配成功,则返回指向内存块的指针。在分配失败的情况下,这两个函数返回一个 NULL 值。calloc() 和 malloc() 函数之间的重要区别是:
访问内容
如果我们在使用 malloc() 函数时尝试访问内存内容,我们可能会得到分段错误错误或垃圾值。在 calloc() 函数的情况下,这样做会得到 0。
初始化
malloc() 函数分配内存并返回指向块开头的指针。它不会初始化分配的内存。另一方面, calloc() 函数不仅分配内存,还将分配的内存块初始化为 0。
参数数量
与 malloc() 函数不同, calloc() 函数有两个参数:
- 要分配的块数
- 每个内存块的大小
问题:在 C 编程语言中比较数组和指针?
答: 以下是 C 中数组和指针之间的各种差异:
- 定义- 数组是一种数据结构形式,它在连续的内存位置存储多个同类元素。然而,指针是存储或指向某个其他变量的内存地址的变量。
- 初始化- 可以在定义处初始化数组。但是,不能在定义处初始化指针。
- 大小- 虽然指针只能存储单个变量的地址,但数组能够存储多个元素。数组存储的元素总数由数组大小决定。
问题:C 中的结构和联合之间的重要区别是什么?
答: C语言面试题和答案合集 - 以下是 C 编程语言中结构体和联合体之间的三个重要区别:
- 对于相同的数据类型,结构比联合需要更多的内存。
- 修改结构成员的值不会影响其他成员。然而,在工会中做同样的事情会影响工会的所有成员。
- 虽然在联合中一次只能访问一个元素,但可以同时访问结构的所有元素。
查看C中联合与结构的深入比较。
问题:按值传递与按引用传递有何不同?
答: 传值和传引用也分别称为传值调用和传引用调用。在按值调用中,值作为参数发送/传递给函数。当需要不修改实际参数时使用传值。与实际参数有关的地址通过引用发送/传递给调用中的函数。当需要修改实际参数时使用引用传递。对被调用函数中的参数所做的更改不会反映在按值传递的调用函数中。与此相反,对被调用函数中的参数所做的更改通过引用传递到调用函数中。
详细了解通过引用传递。
问题:#include " stdio.h "是否正确?使用 < > 和" "来包含头文件有什么区别?
答案: 是的,#include "stdio.h" 是正确的。使用尖括号 (<>) 和双引号 (" ") 来包含头文件的区别在于编译器搜索特定头文件的方式。
当我们使用尖括号时,编译器只在内置的包含路径中搜索头文件。但是,当使用双引号时,编译器首先在当前工作目录中搜索头文件,如果在当前工作目录中找不到,则在内置包含路径中搜索。
问题:如何解析全局符号的作用域?
答: 我们可以使用 extern 存储说明符来解析全局符号的范围。extern 关键字用于扩展变量和函数的可见性或范围。由于默认情况下 C 函数在整个程序中都是可见的,因此不需要将其与函数声明或定义一起使用。
问题:我们什么时候使用 register 关键字?
答: 寄存器存储说明符,即register关键字,用于在机器寄存器中存储变量。这通常用于频繁使用的变量,例如循环控制变量。使用 register 关键字的主要目的是通过最小化变量访问时间来加速程序。
问题:你对rvalue和ivalue的理解是什么?
答案: 赋值运算符 (=) 左侧的表达式称为 ivalue。右值是赋值运算符右侧的一个表达式,它被赋值给一个 ivalue。
例如,
int a = 25 ;
int a 是上述示例中的 ivalue,而 25 是 rvalue。虽然 ivalue 在单个表达式之外持续存在,但右值不会在使用它的表达式之外持续存在。
问题:实参与形参有何不同?
答: 实际参数是在调用端发送给函数的参数。然而,形式参数是在函数定义期间接收的参数。形式参数是在某些函数中使用的标识符,用于代表调用者传递给函数的值。这个由调用者传递给函数的实际值就是实际参数。
只要形式参数的功能处于活动状态,它们就会绑定到实际值。当函数返回给它的调用者时,形参不存储任何值。例如:
#include <stdio.h>
#include <conio.h>
int totalsum(int a, int b, int c) // Formal parameters
{
int total;
total = a + b +c;
return total;
}
int main()
{
int sum;
int a = 22; int m = 24; int p = 28; // Actual parameters
sum = totalsum(a, m, p);
printf ("The total sum is %d.", sum);
}
输出:
The total sum is 74.
实际参数和形式参数之间的另一个主要区别是,虽然后者始终是变量,但前者可以是表达式、函数调用甚至数字。例如,在上面的示例中,以下也是有效的实际参数(在对 totalsum 的函数调用中):
sum = totalsum (10+15, 12*2, 56/2); // 实际参数是表达式。
sum = totalsum (a, (int) sqrt(576), p); // 实际参数之一是函数调用。
sum = totalsum (22, 24, 28); // 实际参数是数字。
问题:请解释一个自指结构。
答: 自引用结构包含与其元素相同的结构指针变量。换句话说,它是一种数据结构,其中指针指向相同数据类型的结构。自引用结构用于图、堆、链表、树等。
问题:你对模块化编程的理解是什么?
答: 模块化编程方法涉及将整个程序划分为独立的、可互换的子程序,即用于完成所需功能的函数和模块。模块化编程中涉及的每个功能或模块都具有执行整个程序所需功能的单个方面所需的一切。
问题:请解释 C 中的标记。
答: 令牌是 C 程序中最小的、不可分割的单元,具有不同的含义。以下是 C 语言中的各种类型的令牌:
- 常量- 在程序执行期间无法更改的固定值。
- 标识符- 这是指函数、变量、数组、结构等的名称。
- 关键字/保留名称- 具有特殊含义的预定义词,不能用作变量名称。
- 运算符- 告诉 C 编译器执行特定逻辑、数学或关系运算的符号。
- 特殊字符- 除字母和数字外的所有字符都是特殊字符。
问题:你对 C 预处理器的理解是什么?
答: C语言常见面试题有哪些 - C 编译器会自动使用 C 预处理器来转换程序,即在实际编译开始之前执行某些操作。C 预处理器是一个宏处理器,因为它可以为较长的结构定义简短的缩写,称为宏。
问题:请解释 C 中的位域。
回答:位域是在结构内用预定义宽度(大小)定义的变量。位域的一般语法是:
struct {
type [member_name] : width ;
};
type - 整数类型,例如 int 和 signed int,确定如何解释位字段的值。
member-name - 位域的名称。
宽度- 位字段中的位数。必须小于或等于指定整数类型的位宽。
问题:C 中的命令行参数是什么?
答: 命令行参数是在程序执行期间传递给 C 程序中的 main() 函数的参数。命令行参数的典型用途是满足从外部控制程序的需要。
观察以下代码,
#include <stdio.h>
#include <conio.h>
void main (int numofargs, char *args[])
{
//code
}
在 main() 函数中,命令行参数的数量由 numofargs 给出。操作系统会自动更新它。args 是一个指针数组,其中包含 char 类型的指针。这些指向提供给程序的(命令行)参数。
注意:当没有命令行参数传递给程序时,numofargs 参数将为 1。args[0] 保存 C 程序的名称,args[1] 指向第一个命令行参数,而 args[n ] 指向最后一个命令行参数。
问题:简述C中的各种文件打开方式?
答:文件是在 C 程序中使用 fopen() 函数打开的。它在 stdio.h 头文件中定义。fopen() 的一般语法是:
ptr = fopen (“file address”, “mode”);
可以在 C 程序中以以下 12 种不同的打开模式打开文件:
- r - 打开文件进行读取。
- rb - 打开一个文件以二进制模式读取。
- w - 打开一个文件进行写入。
- wb - 打开一个文件以二进制模式写入。
- a - 打开文件进行追加,即将数据添加到文件末尾。
- ab - 打开一个文件以二进制模式追加。
- r+ - 打开文件进行读写。
- rb+ - 以二进制模式打开文件进行读写。
- w+ - 打开文件进行读写。
- wb+ - 以二进制模式打开文件进行读写。
- a+ - 打开文件进行读取和追加。
- ab+ - 打开一个文件,以二进制模式读取和追加。
保留 r、rb、r+ 和 rb+ 模式;如果在其他模式下尝试打开时未找到该文件,则会创建该文件。如果文件在这 4 种文件打开模式下不存在,则 fopen() 返回 NULL。
问题:比较局部变量和全局变量。
答:以下是局部变量和全局变量之间的各种差异:
1. 声明
局部变量是在函数内部声明的,而全局变量是在函数外部声明的变量。
2. 生命周期
局部变量的生命周期与声明它的功能块有关。当函数退出时,变量被销毁。全局变量会在程序的整个生命周期内保持不变。
3. 范围
局部变量的范围仅限于声明它的函数或代码块。全局变量具有全局作用域,即它们在整个程序中都可用。
4. 存储
除非明确指定,否则局部变量存储在堆栈中。全局变量的存储由编译器本身决定。
问题:什么是静态变量?为什么我们需要它?
答: 一个值是固定的,在程序执行过程中不能改变的变量,即它在多次函数调用之间保留存储的值,称为静态变量。关键字 static 表示静态变量。静态变量最初初始化为 0。当值更新时,它被分配给静态变量。它只在内存堆中初始化一次。我们使用静态变量来:
- 减少内存消耗
- 在所有职能中共享共同价值
问题:请解释 C 中的递归。
答: 递归是函数直接或间接调用自身的过程。这样的函数称为递归函数。递归函数涉及两个阶段:
- 缠绕阶段- 它在递归函数调用自身时开始,并在达到条件时结束。
- 展开阶段- 在达到条件时开始,即在缠绕阶段结束时开始,并在控制返回到原始调用时结束。
问题:你能写一个 C 程序来检查输入的数是否是素数吗?
回答:
#include <stdio.h>
#include <conio.h>
void main()
{
int a, i, b=0, flag=0;
printf("Enter a number: ");
scanf("%d",&a);
b=a/2;
for(i=2;i<=b;i++)
{
if(a%i==0)
{
printf("The number you entered is not a prime number!");
flag=1;
break;
}
}
if(flag==0)
printf("The number you entered is a prime number.");
getch();
}
示例输出:
输入数字:22
The number you entered is not a prime number!
问题:请编写一个程序,使用递归找出给定数字的阶乘。
回答:
#include <stdio.h>
#include <conio.h>
long factorial (int n)
{
if (n==0)
return 1;
else
return (n * factorial(n-1)); //recursion
}
void main()
{
int number;
long fact;
printf("Enter a number: ");
scanf("%d", &number);
fact = factorial(number);
printf("The factorial of %d is %ld!\n", number, fact);
getch();
}
示例输出:
输入一个数字:5
The factorial of 5 is 120!
高级面试问题
问题:什么是 C 中的远指针?
答:远指针是一个 32 位的指针,可以访问所有 16 个段,即 RAM 的整个驻留内存。它可以访问给定段中计算机内存之外的信息。要使用远指针,需要:
- 分配扇区寄存器来存储段中的数据地址,以及
- 在最近的扇区内存储另一个扇区寄存器
问题:请解释 C 中的 auto 关键字。
答: auto 是代码块或函数内声明的所有变量的默认存储类。因此,局部变量也可以称为自动变量或自动变量。如果没有值存储在自动变量中,那么它会得到一个垃圾值。之所以这样称呼自动变量,是因为这些变量分别在进入和退出声明它们的代码块或函数时分配和释放内存。通常,无需明确提及 auto 关键字。
问题:我们为什么要使用 sprintf() 函数?
答: sprintf() 函数称为字符串打印。我们使用 sprintf() 函数将输出存储在函数指定的字符缓冲区中,即将数据传输到缓冲区。该函数的一般语法是:
int sprintf
(char *str, const char*string,.....);
sprintf() 函数返回字符串中存在的字符总数。下面是一个演示 sprintf() 函数使用的示例:
#include <stdio.h>
#include <conio.h>
int main()
{
char buffer[25];
sprintf(buffer, "This string is now stored in the buffer."); /* Using the sprintf() function for storing the string in the buffer.*/
printf("%s", buffer);
int n = sprintf(buffer, "This string is now stored in the buffer.");
printf("\nThe total number of characters in the string is %d.", n); // The sprintf() function returns the total number of characters in the stored string.
return 0;
}
输出:此字符串现在存储在缓冲区中。
字符串中的字符总数为 40。
问题:说出 getch() 和 getche() 函数之间的区别。
答: getch() 和 getche() 函数都用于从键盘读取单个字符。然而,两者之间的区别在于显示输出。getche() 函数在输出屏幕上显示数据,输入的字符,而 getch() 函数不显示。使用 Alt+F5 查看输入的字符。
问题:解释近、远和巨大指针之间的区别。
答: 任何虚拟地址都有选择器和偏移量。虽然近指针没有显式选择器,但远指针和巨大指针有。对远指针执行指针算术不会导致修改选择器。然而,在一个巨大的指针的情况下,它确实如此。
问题:C语言面试题和答案合集 - 请定义类型转换。
答: 类型转换是将一种数据类型转换为另一种数据类型的过程。它有两种类型:
1. 隐式类型转换- 也称为自动转换,隐式类型转换由 C 编译器自动执行,即它不需要转换运算符。例如:
#include <stdio.h>
#include <conio.h>
void main ()
{
int x = 22;
float b = x; //implicit type conversion
printf(“%f”, b);
}
输出:22.000000
2. 显式类型转换- 与隐式类型转换不同,显式类型转换由程序员执行。类型转换运算符用于告诉编译器将一种数据类型转换(转换)为另一种数据类型。例如:
#include <stdio.h>
#include <conio.h>
void main ()
{
float x = 22.22;
int b = (int) x; //explicit type conversion
printf(“%d”, b);
}
输出:22
这里, (int) 是类型转换运算符。
问题:编写一个 C 程序来检查输入的数字是否是回文数。
答: 一个回文数是一个读取相同的,无论是向前或向后。
#include<stdio.h>
#include<conio.h>
void main()
{
int n, r, sum=0, temp;
printf("Enter a number: ");
scanf("%d",&n);
temp=n;
while(n>0)
{
r=n%10;
sum=(sum*10)+r;
n=n/10;
}
if(temp==sum)
printf("It is a palindrome number!");
else
printf("It is not a palindrome number!");
getch();
}
示例输出:
输入一个数字:12321
It is a palindrome number!
问题:从空指针和悬空指针可以理解什么?
答:在空指针和悬空指针中可以注意到相当大的差异。空指针没有特别指向任何东西。也就是说,它不指向任何东西。而悬空指针是最初持有有效地址的指针,但后来,该有效地址被释放。
问题:将参数传递给函数和状态的不同方式是什么,以及什么时候使用?
答:主要有两种向函数传递参数的方式,如下所示:
- 引用调用——在这种技术中,实际参数的地址被发送而不是值。当用户不希望实参被形参改变时选择它。
- 按值调用 -在这种技术中,我们只将值作为参数发送给函数。在用户确实希望将实际参数与形式参数一起更改但仅用于使用的情况下选择它。
问题:#undef 预处理器的用途是什么?
答:根据 C 编程语言,#undef 指令的主要目的是作为预处理器的指南,以摆脱特定宏的所有定义。如果宏是非特定的,并且该指定宏上的 #ifdef 指令将显示结果为 false。
问题:C 编程中的递增和递减语句是什么意思,我们如何构造递增和递减语句?
答: C 语言支持的语句基本上有两种类型,增量和减量。基本上有两种方法可以在 C 编程中应用这两种语句。第一个是使用增量运算符( ++ ),另一个是减量运算符( -- )。
例如:如果我们使用 ( x ++ ),那么这意味着给出以 1 的速率递增 x 值的命令。
问题:列出源代码和目标代码之间的区别。
回答:
- 源代码:源代码通常从程序员那里得到一个命令,这些代码负责指示计算机执行什么?使用扩展名 .C,我们可以将此代码保存在 C 编程中。
- 目标代码:带扩展名。OBJ,我们可以在C编程中保存目标代码。这是两个代码之间的主要区别。
问题:详细说明我们可以在 C 编程中在输出屏幕中应用引号字符 (and) 的过程?
答:我们都知道应用引号字符是 printf 语句的一部分,为了在输出屏幕中应用该字符,你可以使用说明符 / ' this 用于单引号和 /” 用于双引号的格式。
问题:C 编程中的嵌套循环是什么意思?
答:当一个循环进入另一个循环并开始运行该循环时,称为嵌套循环。外循环将指定内循环执行其功能的次数以及每次第一个循环执行其任务的次数。
问题:模数运算在C编程中有什么用?
答: C 编程中的模运算符在此编程中是非常重要的运算符,因为该模运算告诉编程函数中的除法运算。它基本上显示了两个数字相除后剩下的余数。用(%)符号表示。
例如:
- 20 % 3 = 2,这将表示为,当我们将 20 除以 3 时,剩下 2。
- 11 % 2 =1,这意味着当我们将 11 除以 2 时,我们得到 1 的余数。
问题:C 编程支持的一般形式是什么?详细解释其概念。
答:它从预处理器指令开始它的过程,这些指令执行很多功能,比如负责指定头文件,它还告诉我们要在 C 编程过程中使用的常量。整个过程之后就是这个编程的主要功能,也就是航向功能。该函数执行变量声明和最重要的程序语句。
问题:C 编程中的随机文件访问起着非常重要的作用。为什么?列出它的一些优点。
答案 - 我们都知道,在每台计算机中,我们都存储了大量重要信息,每次我们都需要花费大量时间从大型数据库中查找关键内容,但是这个随机访问文件有助于解决这个问题。
- 它有助于从大型数据库中更快地找到关键数据。
- 当程序中有很多地址时,它有助于间接转移到目标地址。
问题:结构类型在 C 编程中的作用是什么?
答:结构类型在 C 编程中的主要作用是存储记录。这些记录是根据它们的字段类型存储的。这有助于我们在紧急搜索时轻松定位记录,因为我们会在特定字段文件夹中找到所有记录。这有助于节省时间和金钱。
问:C语言是中级语言吗?如果是,那为什么会这样?
答:是的,众所周知,C 语言是一种中级语言。这是因为它有一个非常独特和有趣的特性,使它表现得像一种高级语言。但同时,它有利于在与硬件交互时使用低级方法。它还支持在其功能中使用英语类型的单词。所有这些特性使其成为高级语言。而且,它具有存储内存结构的独特功能。
问题:保留字在C编程中的作用是什么?详细说明它们。
答:标准C 语言库中存储了某些词,所有这些词都称为保留词。所有这些词都是独一无二的,具有不同的含义,因此它们不能用于任何其他目的而不是其原始目的。一些示例是 void 和 return 等。
问题:在 C 编程中遵循哪些不同的控制结构?
答:在 C 编程中,我们通常遵循三种类型的控制结构,即序列、选择和重复。
- 顺序:这个控制结构遵循程序执行过程中从上到下的路径,这个流程是有顺序的。
- 选择:在这种情况下,代码在评估为真或假的条件下执行。
- 重复:在此,程序语句将遵循重复的步骤。重复的另一个名称称为循环结构。
问题:C 编程中调试的确切含义是什么?
答:调试是指帮助分配程序中错误的过程。它可能会停止执行过程。为了解决这个执行过程,调试将识别这些错误并消除这些错误和并发症。所以它在C编程的执行过程中起着非常重要的作用。所以它在C编程的执行过程中起着非常重要的作用。
问题:如何在 C 程序中应用注释?详细解释。
答:评论主要用于在程序中提供反馈或评论。所有这些评论都用于获取有关用户正在使用的程序的即时信息。这些注释没有限制,可以是一行,也可以是多行,我们可以将这些行放在程序的任何位置。
问题:算法在 C 编程中的作用是什么?细化这个角色。
答:为了得到任何问题的解决方案,我们必须创建算法以逐步获得解决方案。它基本上给出了任何程序的开始和结束的想法,因此它给出了一种蓝图。它还讲述了程序中进程的计算。
问题:语法错误的确切含义是什么?
答:编程语言中出现的错误称为语法错误。它通常发生在命令被程序拼错时,因此,它执行错误的功能。当命令以小写形式给出但错误地以大写形式给出时,也可能发生这种情况。此外,有时我们会使用错误的符号。所有这些问题和错误都会给 C 编程带来错误。
问题:为什么我们在C编程中会产生随机符号?
答: rand() 命令基本上用于在 C 编程中生成随机符号。
例如——如果我们给 anyNum 的命令等于 rand(),在这种情况下,它会在 number 中生成一个从 0 开始的整数,应该认为这个 number 是一个 integer 类型的变量。
问题:C 语言在计算机科学中的确切含义是什么?
答: C 是一种中级语言,也称为结构化编程语言。因为它有一个非常独特的功能,使它可以像高级语言一样工作。但同时,它有利于在与硬件交互时使用低级方法。它还支持在其功能中使用英语类型的单词。所有这些特性使其成为高级语言。而且,它具有存储内存结构的独特功能。
问题:解释快速和内存管理是 C 语言的独特之处吗?
回答:
- 速度快: C 编程中使用的运算符和数据类型非常有效和强大,可以提高工作速度。因此,它有助于加快速度。
- 内存管理:它有一个非常独特的内置内存功能,可以非常有效和高效地处理大量数据。这有助于提高 C 编程的整体性能。
问题:我们在 C 编程中出于什么目的使用该函数?
答:函数的使用如下——
- 它不允许在程序中重复代码和信息。这意味着避免重写相同的代码。
- C 编程的函数也被调用任意次数,并且可以从我们程序的任何地方调用。
- 该功能有助于非常轻松地跟踪任何类型的程序,并且只有在将程序划分为功能时才会发生这种情况。
- 将大任务分解为小任务非常容易,因此它执行了可重用的独特功能。这种分解数据的过程使 C 编程更容易理解。
问题:C 编程支持哪些不同类型的递归?另外,解释它的类型。
答案 - C语言常见面试题有哪些?C 编程的函数调用自身的过程,该过程称为递归,调用自身的函数在 C 编程中称为递归函数。这个递归是两阶段的。第一个是卷绕阶段,另一个是放卷阶段。
- 缠绕阶段:当我们在函数调用自身时最终达到某个条件时,则称为缠绕阶段。
- 展开阶段:它在达到条件阶段时开始,在这种情况下,控制返回到其原始调用。
问题:C 编程支持哪些不同类型的数组?
答案 - 当相似类型的元素排列在一起时,该阶段称为数组,它支持连续的内存位置。它还负责使编码过程变得非常简单,并且还使代码排序。这些数组一般有两种类型。第一个是一维数组,另一个是多维数组。
- 一维数组: 这里的元素按顺序存储,即一个元素一个一个地存储。
- 多维数组:当数组包含多个数组时,这种情况称为多维数组。
问题:解释联合在 C 编程中的作用。
答: Union 基本上允许用户在一个单元中存储多种类型的数据,它是一种用户自定义数据。它的独特之处在于它不存储所有输入到程序中的数据的内存,而只存储在最大成员的内存中。这有助于解决内存过载的问题。在这种情况下,我们一次只能访问一种变量。
问题:解释一下C语言编程中auto关键字的意义和作用?
答: C 编程中出现的每个局部变量函数都称为自动或自动变量。知道局部变量是那些在功能块内的变量是非常重要的。局部变量的另一个名称是 auto 变量。如果本地值不包含任何键值,那么它只会显示垃圾值。
问题:解释内存泄漏这个术语以及为什么在 C 编程中了解这个术语很重要?
答: C 编程中的内存泄漏发生在内存继续存储在内存空间中而不删除任何在编码过程中已经用完的信息时。在这种情况下,可能会出现内存泄漏。如果用户在程序中有守护进程和服务器,这肯定会对用户有害。这可能会将信息泄露给竞争对手和其他竞争公司。
问题:你对逻辑错误了解多少,并指出语法和逻辑错误之间的区别。
回答:
- 逻辑错误: 逻辑错误总是发生在复杂化过程中,很容易通过,但在这种情况下,我们将不会得到预期的结果。当我们将错误的公式传递到代码中时,就会发生此类错误。
- 语法错误:编程语言中出现的错误称为语法错误。它通常发生在命令被程序拼错时,因此,它执行错误的功能。当命令以小写形式给出但错误地以大写形式给出时,也可能发生这种情况。此外,有时我们会使用错误的符号。所有这些问题和错误都会给 C 编程带来错误。
问题:顺序存取文件在 C 编程中的确切作用是什么?
答案 - 它在 C 编程中的主要功能是存储和检索文件中的数据,然后将该文件转换为不同的形式。这些总是按顺序排列和存储。为了访问一个特定的文件,我们可以一次只读取一个数据。
问题:链表在 C 编程中的重要性是什么?
答:当节点在列表中相互连接时,该列表称为链表。这个列表只能通过使用指针来创建。这有助于有效利用程序中的内存空间。
问题:解释一下C编程中queue和FIFO的含义?
答:C语言常见面试题有哪些?队列是 C 编程中存在的一种数据结构,该队列中存在的所有数据都以称为 FIFO 的格式存储。FIFO 的完整形式是先进先出。在每个队列中,第一个数据在第一行可用。
问题:二叉树与链表有何相似之处?
答:这里的二叉树是链表的扩展,链表是链表中相互连接的节点,链表称为链表。这个列表只能通过使用指针来创建。这有助于有效利用程序中的内存空间。二进制列表还使用了两个指针,这些指针是左右指针。所以基本上每个节点的末端都有两个指针。
C语言面试题和答案合集概括
这总结了我们的 40 多个最佳 C 面试问题列表。你已经知道多少答案?通过评论告诉我们。文章中是否有一些错误/过时的信息?我们将非常感谢与我们分享相同的内容并使文章更好。想提高你的 C 技能吗?还是想学C?