📅  最后修改于: 2020-10-23 01:19:37             🧑  作者: Mango
下面列出了50个最常见的C编程面试问题和答案。
C是一种中级的过程编程语言。过程编程语言也称为结构化编程语言,是一种将大型程序分解为较小的模块,并且每个模块都使用结构化代码的技术。此技术可最大程度减少错误和误解。更多细节。
因为大多数编译器和JVM都是用C语言编写的,所以C被称为母语。在C语言大量借鉴了C语言之后开发的大多数语言,例如C++, Python,Rust,javascript等。它引入了新的核心概念,例如在这些语言中使用的数组,函数,文件处理。更多细节。
C被称为中级编程语言,因为它绑定了低级和高级编程语言。我们可以使用C语言作为系统编程来开发操作系统,也可以使用应用程序编程来生成菜单驱动的客户驱动的计费系统。更多细节。
丹尼斯·里奇(Dennis Ritchie)。更多细节。
C语言是1972年在AT&T的贝尔实验室开发的。更多细节。
C语言的主要功能如下:
printf():printf()函数用于将整数,字符,浮点数和字符串值print到屏幕上。
以下是格式说明符:
scanf():scanf()函数用于接收用户的输入。
以下是局部变量和全局变量之间的区别:
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. |
以下是静态变量的用法:
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
更多细节。
当函数调用自身时,此过程称为递归。调用自身的函数称为递归函数。
递归函数分为两个阶段:
缠绕阶段:当递归函数调用自身时,此阶段在达到条件时结束。
展开阶段:达到条件时,展开阶段开始,控件返回到原始调用。
递归示例
#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
更多细节。
数组是一组相似类型的元素。它具有连续的内存位置。它使代码得以优化,易于遍历和易于分类。声明数组后,数组的大小和类型不能更改。
数组有两种类型:
句法:
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
指针是引用值的地址的变量。它可以优化代码并提高性能。每当在程序中声明变量时,系统就会为该变量分配一些内存。内存中包含一些地址号。拥有该地址号的变量称为指针变量。
例如:
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
更多细节。
不引用任何值的地址但为NULL的指针称为NULL指针。当我们将“ 0″值分配给任何类型的指针时,则它将变为Null指针。
更多细节。
可以访问RAM的所有16个段(整个驻留内存)的指针称为far指针。远指针是一个32位指针,可在给定段中获取内存外部的信息。
我们来看一个例子。
#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不会指向任何内存位置。因此,它不再是悬空的指针。
如果是指针概念的指针,则一个指针指的是另一指针的地址。指向指针的指针是一连串的指针。通常,指针包含变量的地址。指向指针的指针包含第一个指针的地址。让我们通过一个例子来理解这个概念:
#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”变量的地址。
更多细节。
For example:
int a[10];
上面的示例创建一个整数类型的数组,并且数组的大小是固定的,即10。
更多细节。
For example
int *p= malloc(sizeof(int)*10);
上面的示例在运行时分配内存。
更多细节。
句法
句法
句法
在上面的语法中,ptr被分配了新的大小。
句法
上面的语法从指针变量ptr释放内存。
更多细节。
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. |
更多细节。
结构语法
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
更多细节。
联合语法
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。
更多细节。
在C语言中,函数的每个局部变量都称为自动(auto)变量。在函数块内部声明的变量称为局部变量。局部变量也称为自动变量。可以选择在变量的数据类型之前使用自动关键字。如果在本地变量中没有存储任何值,则它由垃圾值组成。
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
是的,我们可以编译,但是不能执行。
但是,如果使用#define,则无需使用main()函数就可以编译并运行C程序。例如:
#include
#define start main
void start() {
printf("Hello");
}
更多细节。
令牌是一个标识符。它可以是常量,关键字,字符串字面量等。令牌是程序中最小的单个单元。 C具有以下标记:
在执行程序时传递给main()函数的参数称为命令行参数。例如:
main(int count, char *args[]){
//code to be executed
}
ANSI代表“美国国家标准学会”。该组织维护着广泛的学科,包括摄影胶片,计算机语言,数据编码,机械零件,安全等。
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()函数输入的值则显示在屏幕上。
新行转义序列由“ \ n”表示。它将在输出屏幕上插入新行。
脑Kernighan。
虚拟地址由选择器和偏移量组成。
近指针没有显式选择器,而远指针和大指针具有显式选择器。当对远指针执行指针算术运算时,不会更改选择器,但是如果指针很大,则可以对其进行修改。
这些是非标准关键字和特定于实现的关键字。这些与现代平台无关。
理想情况下,它是32个字符,但特定于实现。
类型转换是将一种数据类型转换为另一种数据类型的过程,称为类型转换。如果我们要将浮点类型值存储为int类型,则将数据类型显式转换为另一种数据类型。
句法
(type_name) expression;
fopen()函数用于打开文件,而fclose()用于关闭文件。
是的,通过将数组的基地址保存在指针中,我们可以使用指针访问数组。
连续运行无限次的循环称为无限循环。
无限循环:
for(;;){
//code to be executed
}
无限While循环:
while(1){
//code to be executed
}
无限循环时:
do{
//code to be executed
}while(1);
#include
void main(){
if(printf("hello world")){} // It prints the ?hello world? on the screen.
}
#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();
}
#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
#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();
}
#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.
}
#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();
}
#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();
}
#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.
}
#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.
}
#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.
}