下面列出了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中的递归?
当函数调用自身时, 此过程称为递归。调用自身的函数称为递归函数。
递归函数分为两个阶段:
- 缠绕阶段
- 放卷阶段
缠绕阶段:当递归函数调用自身时, 此阶段在达到条件时结束。
展开阶段:达到条件时, 展开阶段开始, 并且控件返回到原始调用。
递归示例
#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具有以下标记:
- 标识符:标识符是指变量的名称。
- 关键字:关键字是编译器解释的预定义单词。
- 常数:常数是在程序执行期间不能更改的固定值。
- 运算符:运算符是执行特定操作的符号。
- 特殊字符:除字母和数字外的所有字符均视为特殊字符。
30)什么是命令行参数?
在执行程序时传递给main()函数的参数称为命令行参数。例如:
main(int count, char *args[]){
//code to be 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”表示。它将在输出屏幕上插入新行。
更多细节。
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("armstrong number ");
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面试问题
评论前必须登录!
注册