个性化阅读
专注于IT技术分析

推荐!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 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面试问题

赞(0) 打赏
未经允许不得转载:srcmini » 推荐!C编程精品面试题最新合集大全
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

微信扫一扫打赏