推荐!C编程精品面试题最新合集大全

推荐!C编程精品面试题最新合集大全

文章图片
下面列出了50个最常见的C编程面试问题和答案。
1)什么是C语言?
C是一种中级的过程编程语言。过程编程语言也称为结构化编程语言, 是一种将大型程序分解为较小的模块, 并且每个模块都使用结构化代码的技术。此技术可最大程度地减少错误和误解。更多细节。
2)为什么C被称为母语?
因为大多数编译器和JVM都是用C语言编写的, 所以C被称为母语。在C语言大量借鉴了C语言之后开发的大多数语言, 例如C ++, Python, Rust, javascript等。它引入了新的核心概念, 例如在这些语言中使用的数组, 函数, 文件处理。更多细节。
3)为什么C被称为中级编程语言?
C被称为中级编程语言, 因为它绑定了低级和高级编程语言。我们可以使用C语言作为系统编程来开发操作系统, 也可以使用应用程序编程来生成菜单驱动的客户驱动的计费系统。更多细节。
4)谁是C语言的创始人?
丹尼斯·里奇(Dennis Ritchie)。更多细节。
5)C语言是何时开发的?
C语言是1972年在AT&T的贝尔实验室开发的。更多细节。
6)C语言的功能是什么?
C语言的主要功能如下:
  • 简单:C是一种简单的语言, 因为它遵循结构化的方法, 即程序分为多个部分
  • 可移植性:C是高度可移植的, 这意味着一旦编写程序, 就可以在几乎无需修改的情况下在任何机器上运行。
  • 中级语言:C是中级编程语言, 因为它结合了低级语言和高级语言的功能。
  • 结构化:C是一种结构化语言, 因为C程序分为多个部分。
  • 快速:C语言使用了一组强大的数据类型和运算符, 因此速度非常快。
  • 内存管理:C提供了内置的内存功能, 可以节省内存并提高程序的效率。
  • 可扩展的:C是一种可扩展的语言, 因为它将来可以采用新功能。
更多细节。
7)printf()和scanf()函数的用途是什么?
printf():printf()函数用于将整数, 字符, 浮点数和字符串值打印到屏幕上。
以下是格式说明符:
  • %d:这是用于打印整数值的格式说明符。
  • %s:这是用于打印字符串的格式说明符。
  • %c:这是用于显示字符值的格式说明符。
  • %f:这是用于显示浮点值的格式说明符。
scanf():scanf()函数用于接收用户的输入。
更多细节。
8)C中的局部变量和全局变量有什么区别?
以下是局部变量和全局变量之间的区别:
比较依据 Local variable Global variable
在函数或块中声明的变量称为局部变量。 在函数或块外部声明的变量称为全局变量。
变量的范围在声明变量的函数中可用。 变量的范围在整个程序中都可用。
变量只能由声明它们的函数内的那些语句访问。 整个程序中的任何语句都可以访问变量。
当输入功能块并在其退出处销毁时, 将创建变量的寿命。 在程序执行之前, 变量的生命周期一直存在。
除非指定, 否则变量将存储在堆栈中。 编译器决定变量的存储位置。
更多细节。
9)C中静态变量的用途是什么?
以下是静态变量的用法:
  • 声明为静态的变量称为静态变量。静态变量在多个函数调用之间保留其值。
  • 使用静态变量是因为静态变量的范围在整个程序中都可用。因此, 我们可以在程序中的任何位置访问静态变量。
  • 静态变量最初被初始化为零。如果我们更新变量的值, 则将分配更新后的值。
  • 静态变量用作所有方法共享的公共值。
  • 静态变量在内存堆中仅初始化一次, 以减少内存使用量。
更多细节。
10)函数在C中的用途是什么?
C函数的用途是:
  • C函数用于避免在我们的程序中一次又一次地重写相同的代码。
  • 可以在程序的任何位置多次调用C函数。
  • 将程序划分为功能时, 可以轻松跟踪我们程序的任何部分。
  • C函数提供了可重用性的概念, 即它将大任务分解为较小的任务, 从而使C程序更易于理解。
更多细节。
11)在C中按值调用和按引用调用之间有什么区别?
以下是按值调用和按引用调用之间的区别:
按价值致电 通过参考电话
将值的副本传递给函数时, 原始值不会被修改。 将值的副本传递给函数时, 将修改原始值。
实际参数和形式参数在单独的存储器位置中创建。 实际参数和形式参数在相同的存储位置中创建。
在这种情况下, 实际参数仍然是安全的, 因为它们无法修改。 在这种情况下, 实际的参数不可靠, 因为会对其进行修改。
实际参数的副本将传递给形式参数。 实际参数的地址将传递给它们各自的形式参数。
按值调用的示例:
#include < stdio.h> void change(int, int); int main() { int a=10, b=20; change(a, b); //calling a function by passing the values of variables. printf("Value of a is: %d", a); printf("\n"); printf("Value of b is: %d", b); return 0; } void change(int x, int y) { x=13; y=17; }

输出
Value of a is: 10 Value of b is: 20

通过引用进行调用的示例:
#include < stdio.h> void change(int*, int*); int main() { int a=10, b=20; change(& a, & b); // calling a function by passing references of variables. printf("Value of a is: %d", a); printf("\n"); printf("Value of b is: %d", b); return 0; } void change(int *x, int *y) { *x=13; *y=17; }

输出
Value of a is: 13 Value of b is: 17

更多细节。
12)什么是C中的递归?
当函数调用自身时, 此过程称为递归。调用自身的函数称为递归函数。
递归函数分为两个阶段:
  1. 缠绕阶段
  2. 放卷阶段
缠绕阶段:当递归函数调用自身时, 此阶段在达到条件时结束。
展开阶段:达到条件时, 展开阶段开始, 并且控件返回到原始调用。
递归示例
#include < stdio.h> int calculate_fact(int); int main() { int n=5, f; f=calculate_fact(n); // calling a function printf("factorial of a number is %d", f); return 0; } int calculate_fact(int a) { if(a==1) { return 1; } else return a*calculate_fact(a-1); //calling a function recursively. }

输出
factorial of a number is 120

更多细节。
13)C语言中的数组是什么?
数组是一组相似类型的元素。它具有连续的内存位置。它使代码得以优化, 易于遍历和易于分类。声明数组后, 数组的大小和类型不能更改。
数组有两种类型:
  • 一维数组:一维数组是一个将元素依次存储的数组。
语法
data_type array_name[size];

  • 多维数组:多维数组是一个包含多个数组的数组。
语法
data_type array_name[size];

数组示例:
#include < stdio.h> int main() { int arr[5]={1, 2, 3, 4, 5}; //an array consists of five integer values. for(int i=0; i< 5; i++) { printf("%d ", arr[i]); } return 0; }

输出
1 2 3 4 5

更多细节。
14)C语言中的指针是什么?
指针是引用值的地址的变量。它可以优化代码并提高性能。每当在程序中声明变量时, 系统就会为该变量分配一些内存。内存中包含一些地址号。拥有该地址号的变量称为指针变量。
例如:
Data_type *p;

上面的语法告诉我们p是一个指针变量, 它保存给定数据类型值的地址号。
指针示例
#include < stdio.h> int main() { int *p; //pointer of type integer. int a=5; p=& a; printf("Address value of 'a' variable is %u", p); return 0; }

输出
Address value of 'a' variable is 428781252

更多细节。
15)指针在C中的用法是什么?
  • 访问数组元素:指针用于遍历整数和字符串数组。该字符串是一个字符数组, 以空字符’ \ 0’ 结尾。
  • 动态内存分配:指针用于程序执行期间的内存分配和释放。
  • 按引用调用:指针用于将变量的引用传递给其他函数。
  • 数据结构, 如树, 图, 链表等:指针用于构造不同的数据结构, 如树, 图, 链表等。
16)什么是C中的NULL指针?
不引用值的任何地址但为NULL的指针称为NULL指针。当我们将” 0″ 值分配给任何类型的指针时, 它将变为Null指针。
更多细节。
17)C语言中的远指针是什么?
可以访问RAM的所有16个段(整个驻留内存)的指针称为far指针。远指针是一个32位指针, 可在给定段中获取内存外部的信息。
18)C中的悬空指针是什么?
  • 如果一个指针指向任何内存位置, 但同时另一个指针删除了第一个指针占用的内存, 而第一个指针仍指向该内存位置, 则第一个指针将称为悬空指针。这个问题被称为悬空指针问题。
  • 当在不修改指针值的情况下删除对象时, 将出现悬挂指针。指针指向释放的内存。
我们来看一个例子。
#include< stdio.h> void main() { int *ptr = malloc(constant value); //allocating a memory space. free(ptr); //ptr becomes a dangling pointer. }

在上面的示例中, 最初将内存分配给指针变量ptr, 然后从指针变量释放内存。现在, 指针变量, 即ptr变为悬空指针。
如何克服指针悬空的问题
可以通过将NULL值分配给悬空指针来解决悬空指针的问题。让我们通过一个例子来理解这一点:
#include< stdio.h> void main() { int *ptr = malloc(constant value); //allocating a memory space. free(ptr); //ptr becomes a dangling pointer. ptr=NULL; //Now, ptr is no longer a dangling pointer. }

在上面的示例中, 从指针变量取消分配内存后, 将ptr分配为NULL值。这意味着ptr不会指向任何内存位置。因此, 它不再是悬空的指针。
19)什么是C中的指针?
如果是指针概念的指针, 则一个指针指的是另一指针的地址。指向指针的指针是一连串的指针。通常, 指针包含变量的地址。指向指针的指针包含第一个指针的地址。让我们通过一个例子来理解这个概念:
#include < stdio.h> int main() { int a=10; int *ptr, **pptr; // *ptr is a pointer and **pptr is a double pointer. ptr=& a; pptr=& ptr; printf("value of a is:%d", a); printf("\n"); printf("value of *ptr is : %d", *ptr); printf("\n"); printf("value of **pptr is : %d", **pptr); return 0; }

在上面的示例中, pptr是指向ptr变量地址的双指针, 而ptr指向” a” 变量的地址。
更多细节。
20)什么是静态内存分配?
  • 如果是静态内存分配, 则在编译时分配内存, 并且在执行程序时不能增加内存。在数组中使用它。
  • 静态存储器中变量的生存期就是程序的生存期。
  • 静态内存使用static关键字分配。
  • 静态内存是使用堆栈或堆实现的。
  • 需要指针来访问静态存储器中存在的变量。
  • 静态内存比动态内存快。
  • 在静态存储器中, 需要更多的存储空间来存储变量。
For example: int a[10];

上面的示例创建一个整数类型的数组, 并且数组的大小是固定的, 即10。
更多细节。
21)什么是动态内存分配?
  • 如果是动态内存分配, 则会在运行时分配内存, 并且可以在执行程序时增加内存。在链接列表中使用它。
  • 需要malloc()或calloc()函数在运行时分配内存。
  • 内存的分配或释放是在程序执行时完成的。
  • 不需要动态指针即可访问内存。
  • 动态存储器是使用数据段实现的。
  • 存储变量所需的存储空间更少。
For example int *p= malloc(sizeof(int)*10);

上面的示例在运行时分配内存。
更多细节。
22)用C语言进行动态内存分配时使用哪些功能?
malloc()
  • malloc()函数用于在程序执行期间分配内存。
  • 它不会初始化内存, 但会携带垃圾值。
  • 如果无法分配请求的空间, 则返回空指针。
语法
ptr = (cast-type*) malloc(byte-size) // allocating the memory using malloc() function.

calloc()
  • calloc()与malloc()函数相同, 但是不同之处仅在于它使用零值初始化内存。
语法
ptr = (cast-type*)calloc(n, element-size); // allocating the memory using calloc() function.

realloc()
  • realloc()函数用于将内存重新分配为新大小。
  • 如果内存中没有足够的空间, 则分配新块以容纳现有数据。
语法
ptr = realloc(ptr, newsize); // updating the memory size using realloc() function.

在以上语法中, ptr被分配了新的大小。
free():free()函数释放由calloc()或malloc()函数分配的内存。
语法
free(ptr); // memory is released using free() function.

上面的语法从指针变量ptr释放内存。
更多细节。
23)malloc()和calloc()有什么区别?
calloc() malloc()
malloc()函数分配单个块的请求内存。 calloc()函数分配请求的内存的多个块。
它将存储器的内容初始化为零。 它不会初始化内存的内容, 因此会携带垃圾值。
它由两个参数组成。 它仅包含一个参数。
它返回一个指向已分配内存的指针。 它返回一个指向已分配内存的指针。
更多细节。
24)什么是结构?
  • 该结构是用户定义的数据类型, 允许在一个单元中存储多种类型的数据。它占用所有成员的内存之和。
  • 只能通过结构变量访问结构成员。
  • 结构变量访问相同的结构, 但是分配给每个变量的内存将不同。
结构语法
struct structure_name { Member_variable1; Member_variable2 . . }[structure variables];

让我们看一个简单的例子。
#include < stdio.h> struct student { char name[10]; // structure members declaration. int age; }s1; //structure variable int main() { printf("Enter the name"); scanf("%s", s1.name); printf("\n"); printf("Enter the age"); scanf("%d", & s1.age); printf("\n"); printf("Name and age of a student: %s, %d", s1.name, s1.age); return 0; }

输出
Enter the name shikha Enter the age 26 Name and age of a student: shikha, 26

更多细节。
25)什么是工会?
  • 联合是用户定义的数据类型, 它允许在一个单元中存储多种类型的数据。但是, 它不占用所有成员的内存之和。它仅保留最大成员的内存。
  • 在联合中, 我们一次只能访问一个变量, 因为它为联合的所有成员分配了一个公共空间。
联合语法
union union_name { Member_variable1; Member_variable2; . . Member_variable n; }[union variables];

让我们看一个简单的例子
#include< stdio.h> union data { int a; //union members declaration. float b; char ch; }; int main() { union data d; //union variable. d.a=3; d.b=5.6; d.ch='a'; printf("value of a is %d", d.a); printf("\n"); printf("value of b is %f", d.b); printf("\n"); printf("value of ch is %c", d.ch); return 0; }

输出
value of a is 1085485921 value of b is 5.600022 value of ch is a

在上面的示例中, a和b的值被破坏, 只有变量ch显示实际输出。这是因为联合的所有成员共享公共内存空间。因此, 其值当前被更新的变量ch。
更多细节。
26)什么是C中的自动关键字?
在C语言中, 函数的每个局部变量都称为自动(auto)变量。在功能块内部声明的变量称为局部变量。局部变量也称为自动变量。可以选择在变量的数据类型之前使用自动关键字。如果在本地变量中没有存储任何值, 则它由垃圾值组成。
27)sprintf()函数的作用是什么?
sprintf()代表” 字符串打印” 。 sprintf()函数不会在控制台屏幕上打印输出。它将数据传输到缓冲区。它返回字符串中存在的字符总数。
语法
int sprintf ( char * str, const char * format, ... );

让我们看一个简单的例子
#include< stdio.h> int main() { char a[20]; int n=sprintf(a, "javaToint"); printf("value of n is %d", n); return 0; }

输出
value of n is 9

28)我们可以编译没有main()函数的程序吗?
是的, 我们可以编译, 但是不能执行。
但是, 如果使用#define, 则无需使用main()函数就可以编译并运行C程序。例如:
#include< stdio.h> #define start main void start() { printf("Hello"); }

更多细节。
29)什么是代币?
令牌是一个标识符。它可以是常量, 关键字, 字符串文字等。令牌是程序中最小的单个单元。 C具有以下标记:
  1. 标识符:标识符是指变量的名称。
  2. 关键字:关键字是编译器解释的预定义单词。
  3. 常数:常数是在程序执行期间不能更改的固定值。
  4. 运算符:运算符是执行特定操作的符号。
  5. 特殊字符:除字母和数字外的所有字符均视为特殊字符。
30)什么是命令行参数?
在执行程序时传递给main()函数的参数称为命令行参数。例如:
main(int count, char *args[]){ //code tobe executed }

更多细节。
31)ANSI的缩写是什么?
ANSI代表” 美国国家标准学会” 。该组织维护着广泛的学科, 包括摄影胶片, 计算机语言, 数据编码, 机械零件, 安全等。
32)getch()和getche()有什么区别?
getch()函数从键盘读取单个字符。它不使用任何缓冲区, 因此输入的数据将不会显示在输出屏幕上。
getche()函数从关键字读取单个字符, 但是数据显示在输出屏幕上。按Alt + f5查看输入的字符。
让我们看一个简单的例子
#include< stdio.h> #include< conio.h> int main() { char ch; printf("Enter a character "); ch=getch(); // taking an user input without printing the value. printf("\nvalue of ch is %c", ch); printf("\nEnter a character again "); ch=getche(); // taking an user input and then displaying it on the screen. printf("\nvalue of ch is %c", ch); return 0; }

输出
Enter a character value of ch is a Enter a character again a value of ch is a

在上面的示例中, 通过getch()函数输入的值未显示在屏幕上, 而通过getche()函数输入的值则显示在屏幕上。
33)什么是换行符转义序列?
新行转义序列由” \ n” 表示。它将在输出屏幕上插入新行。
【推荐!C编程精品面试题最新合集大全】更多细节。
34)在Dennis Ritchie之后, 谁是设计C语言的主要贡献者?
脑Kernighan。
35)近, 远和巨大指针有什么区别?
虚拟地址由选择器和偏移量组成。
近指针没有显式选择器, 而远指针和大指针具有显式选择器。在远指针上执行指针算术时, 不会修改选择器, 但是如果指针很大, 则可以对其进行修改。
这些是非标准关键字和特定于实现的关键字。这些与现代平台无关。
36)标识符的最大长度是多少?
理想情况下, 它是32个字符, 但特定于实现。
37)什么是类型转换?
类型转换是将一种数据类型转换为另一种数据类型的过程, 称为类型转换。如果要将浮点类型值存储为int类型, 则将数据类型显式转换为另一种数据类型。
语法
(type_name) expression;

38)用C语言打开和关闭文件有哪些功能?
fopen()函数用于打开文件, 而fclose()用于关闭文件。
39)我们可以使用C语言的指针访问数组吗?
是的, 通过将数组的基地址保存在指针中, 我们可以使用指针访问数组。
40)什么是无限循环?
连续运行无限次的循环称为无限循环。
无限循环:
for(; ; ){ //code to be executed }

无限While循环:
while(1){ //code to be executed }

无限循环循环:
do{ //code to be executed }while(1);

41)编写一个无需使用分号即可打印” hello world” 的程序吗?
#include< stdio.h> void main(){ if(printf("hello world")){} // It prints the ?hello world? on the screen. }

更多细节。
42)编写一个程序以交换两个数字而不使用第三个变量?
#include< stdio.h> #include< conio.h> main() { int a=10, b=20; //declaration of variables. clrscr(); //It clears the screen. printf("Before swap a=%d b=%d", a, b); a=a+b; //a=30 (10+20) b=a-b; //b=10 (30-20) a=a-b; //a=20 (30-10)printf("\nAfter swap a=%d b=%d", a, b); getch(); }

更多细节。
43)编写程序不使用递归来打印斐波那契数列?
#include< stdio.h> #include< conio.h> void main() { int n1=0, n2=1, n3, i, number; clrscr(); printf("Enter the number of elements:"); scanf("%d", & number); printf("\n%d %d", n1, n2); //printing 0 and 1 for(i=2; i< number; ++i)//loop starts from 2 because 0 and 1 are already printed { n3=n1+n2; printf(" %d", n3); n1=n2; n2=n3; } getch(); }

更多细节。
44)编写程序以使用递归打印斐波那契数列?
#include< stdio.h> #include< conio.h> void printFibonacci(int n) // function to calculate the fibonacci series of a given number. { static int n1=0, n2=1, n3; // declaration of static variables. if(n> 0){ n3 = n1 + n2; n1 = n2; n2 = n3; printf("%d ", n3); printFibonacci(n-1); //calling the function recursively. } } void main(){ int n; clrscr(); printf("Enter the number of elements: "); scanf("%d", & n); printf("Fibonacci Series: "); printf("%d %d ", 0, 1); printFibonacci(n-2); //n-2 because 2 numbers are already printed getch(); }

更多细节。
45)编写程序以检查C编程中的素数?
#include< stdio.h> #include< conio.h> void main() { int n, i, m=0, flag=0; //declaration of variables. clrscr(); //It clears the screen. printf("Enter the number to check prime:"); scanf("%d", & n); m=n/2; for(i=2; i< =m; i++) { if(n%i==0) { printf("Number is not prime"); flag=1; break; //break keyword used to terminate from the loop. } } if(flag==0) printf("Number is prime"); getch(); //It reads a character from the keyword. }

更多细节。
46)在C编程中编写一个程序来检查回文数?
#include< stdio.h> #include< conio.h> main() { int n, r, sum=0, temp; clrscr(); printf("enter the number="); scanf("%d", & n); temp=n; while(n> 0) { r=n%10; sum=(sum*10)+r; n=n/10; } if(temp==sum) printf("palindrome number "); else printf("not palindrome"); getch(); }

更多细节。
47)编写程序以打印给定数字的阶乘而不使用递归吗?
#include< stdio.h> #include< conio.h> void main(){ int i, fact=1, number; clrscr(); printf("Enter a number: "); scanf("%d", & number); for(i=1; i< =number; i++){ fact=fact*i; } printf("Factorial of %d is: %d", number, fact); getch(); }

更多细节。
48)编写程序以使用递归打印给定数字的阶乘?
#include< stdio.h> #include< conio.h> long factorial(int n)// function to calculate the factorial of a given number. { if (n == 0) return 1; else return(n * factorial(n-1)); //calling the function recursively. } void main() { int number; //declaration of variables. long fact; clrscr(); printf("Enter a number: "); scanf("%d", & number); fact = factorial(number); //calling a function. printf("Factorial of %d is %ld\n", number, fact); getch(); //It reads a character from the keyword. }

更多细节。
49)编写程序以检查C中的阿姆斯特朗编号?
#include< stdio.h> #include< conio.h> main() { int n, r, sum=0, temp; //declaration of variables. clrscr(); //It clears the screen. printf("enter the number="); scanf("%d", & n); temp=n; while(n> 0) { r=n%10; sum=sum+(r*r*r); n=n/10; } if(temp==sum) printf("armstrongnumber "); else printf("not armstrong number"); getch(); //It reads a character from the keyword. }

更多细节。
50)编写一个程序来反转C中的给定数字?
#include< stdio.h> #include< conio.h> main() { int n, reverse=0, rem; //declaration of variables. clrscr(); // It clears the screen. printf("Enter a number: "); scanf("%d", & n); while(n!=0) { rem=n%10; reverse=reverse*10+rem; n/=10; } printf("Reversed Number: %d", reverse); getch(); // It reads a character from the keyword. }

更多细节。
C ++面试题
Java字符串和异常问题
JDBC面试问题
JSP面试问题
休眠面试问题
SQL面试题
Android面试题
MySQL面试问题
宣言
范围
访问
生活
存储
描述
记忆体位置
安全
争论
描述
初始化
参数数量
返回值
Java面试问题
Java多线程问题
Java Collection面试题
Servlet面试问题
春季面试问题
PL / SQL面试问题
Oracle面试问题
SQL Server面试问题

    推荐阅读