📜  C编程面试问题

📅  最后修改于: 2020-10-23 01:19:37             🧑  作者: Mango

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()函数用于将整数,字符,浮点数和字符串值print到屏幕上。

以下是格式说明符:

  • %d :这是用于print整数值的格式说明符。
  • %s :它是用于print字符串的格式说明符。
  • %c :这是用于显示字符值的格式说明符。
  • %f :这是用于显示浮点值的格式说明符。

scanf():scanf()函数用于接收用户的输入。

8)C中的局部变量和全局变量有什么区别?

以下是局部变量和全局变量之间的区别:

Basis for comparison Local variable Global variable
Declaration A variable which is declared inside function or block is known as a local variable. A variable which is declared outside function or block is known as a global variable.
Scope The scope of a variable is available within a function in which they are declared. The scope of a variable is available throughout the program.
Access Variables can be accessed only by those statements inside a function in which they are declared. Any statement in the entire program can access variables.
Life Life of a variable is created when the function block is entered and destroyed on its exit. Life of a variable exists until the program is executing.
Storage Variables are stored in a stack unless specified. The compiler decides the storage location of a variable.

9)C语言中静态变量的用途是什么?

以下是静态变量的用法:

  • 声明为静态的变量称为静态变量。静态变量在多个函数调用之间保留其值。
  • 使用静态变量是因为静态变量的范围在整个程序中都可用。因此,我们可以在程序中的任何位置访问静态变量。
  • 静态变量最初被初始化为零。如果我们更新变量的值,则将分配更新后的值。
  • 静态变量用作所有方法共享的公共值。
  • 静态变量在内存堆中仅初始化一次,以减少内存使用量。

10)函数在C中的用途是什么?

C函数的用途是:

  • C函数用于避免在我们的程序中一次又一次地重写相同的代码。
  • 可以在程序的任何位置多次调用C函数。
  • 将程序划分为功能时,可以轻松跟踪我们程序的任何部分。
  • C函数提供了可重用性的概念,即,它将大任务分解为较小的任务,从而使C程序更易于理解。

11)在C中按值调用和按引用调用之间有什么区别?

以下是按值调用和按引用调用之间的区别:

Call by value Call by reference
Description When a copy of the value is passed to the function, then the original value is not modified. When a copy of the value is passed to the function, then the original value is modified.
Memory location Actual arguments and formal arguments are created in separate memory locations. Actual arguments and formal arguments are created in the same memory location.
Safety In this case, actual arguments remain safe as they cannot be modified. In this case, actual arguments are not reliable, as they are modified.
Arguments The copies of the actual arguments are passed to the formal arguments. The addresses of actual arguments are passed to their respective formal arguments.

按值调用的示例:

#include 
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 
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 
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 
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 
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
           void main()
           {
                   int *ptr = malloc(constant value); //allocating a memory space.
                   free(ptr); //ptr becomes a dangling pointer.
           }

在上面的示例中,最初将内存分配给指针变量ptr,然后从指针变量释放内存。现在,指针变量,即ptr变为悬空指针。

如何克服指针悬空的问题

可以通过将NULL值分配给悬挂指针来解决悬挂指针的问题。让我们通过一个例子来理解这一点:

     #include
           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 
 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()函数用于在程序执行期间分配内存。
      • 它不会初始化内存,但会携带垃圾值。
      • 如果无法分配请求的空间,则返回空指针。

句法

  1. ptr =(cast-type *)malloc(byte-size) //使用malloc()函数分配内存。   

    • calloc()
      • calloc()与malloc()函数相同,但是不同之处仅在于它使用零值初始化内存。

句法

  1. ptr =(cast-type *)calloc(n,元素大小); //使用calloc()函数分配内存。   

    • realloc()
      • realloc()函数用于将内存重新分配为新大小。
      • 如果存储器中没有足够的空间,则分配新块以容纳现有数据。

句法

  1. ptr = realloc(ptr,newsize); //使用realloc()函数更新内存大小。   

在上面的语法中,ptr被分配了新的大小。

    • free():free()函数释放由calloc()或malloc()函数分配的内存。

句法

  1. free(ptr); //使用free()函数释放内存。   

上面的语法从指针变量ptr释放内存。

更多细节。

23)malloc()和calloc()有什么区别?

calloc() malloc()
Description The malloc() function allocates a single block of requested memory. The calloc() function allocates multiple blocks of requested memory.
Initialization It initializes the content of the memory to zero. It does not initialize the content of memory, so it carries the garbage value.
Number of arguments It consists of two arguments. It consists of only one argument.
Return value It returns a pointer pointing to the allocated memory. It returns a pointer pointing to the allocated memory.

更多细节。

24)什么是结构?

  • 该结构是用户定义的数据类型,它允许在一个单元中存储多种类型的数据。它占用所有成员的内存之和。
  • 只能通过结构变量访问结构成员。
  • 结构变量访问相同的结构,但是分配给每个变量的内存将不同。

结构语法

struct structure_name
{
  Member_variable1;
 Member_variable2
.
.
}[structure variables];

让我们看一个简单的例子。

#include 
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
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()代表“字符串print”。 sprintf()函数不会在控制台屏幕上print输出。它将数据传输到缓冲区。它返回字符串存在的字符总数。

句法

int sprintf ( char * str, const char * format, ... );

让我们看一个简单的例子

 #include
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  
#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
#include
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)编写一个无需使用分号即可print“ hello world”的程序吗?

#include    
void main(){    
 if(printf("hello world")){} // It prints the ?hello world? on the screen.
}   

42)编写一个程序以交换两个数字而不使用第三个变量?

#include    
#include    
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)编写程序不使用递归来print斐波那契数列?

#include  
#include  
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

44)编写程序以使用递归print斐波那契数列?

#include    
#include    
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    
#include    
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  
#include  
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)编写程序以print给定数字的阶乘而不使用递归吗?

#include  
#include  
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)编写程序以使用递归print给定数字的阶乘?

#include    
#include    
 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    
#include    
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    
#include    
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.  
}