C编程面试常见问题S3

2021年4月16日19:28:11 发表评论 1,040 次浏览

本文概述

Q.1写下最小的可执行代码?

回答: main是执行代码所必需的。代码是

C

void main()
{
}

输出如下:

Q.2什么是入口控制和出口控制回路?

回答: C仅支持2个循环:

  1. 进入控制:此循环分为两部分
    a。 while循环
    b。 for循环
  2. 退出控制:在此类别中, 有一种类型的循环称为
    a。do while循环。

Q.3为什么预处理器指令最后没有分号?

回答:编译器需要分号,顾名思义,预处理器是在编译前处理源代码的程序。因此分号不是必需的。

Q.4包含带有尖括号<>的头文件和双引号""之间的区别是什么?

回答:如果<>中包含头文件, 则编译器仅在内置包含路径中搜索特定的头文件。如果""中包含头文件, 则编译器将首先在当前工作目录中搜索特定的头文件, 如果找不到, 则在内置include路径中搜索。

Q.5近, 远和巨大指针有什么区别?

回答:这些是MS DOS时代在16位Intel体系结构中使用的一些旧概念, 不再有用。

近指针用于在16位计算机上的当前段中存储16位地址的手段。限制是我们一次只能访问64kb的数据。

一种远指针通常为32位, 可以访问当前段外部的内存。要使用此功能, 编译器会分配一个段寄存器来存储段地址, 然后分配另一个寄存器来存储当前段内的偏移量。

巨大的指针通常也是32位, 并且可以访问外部网段。对于远指针, 段是固定的。在远指针中, 段部分无法修改, 但在"巨大"中可以修改

近指针 远指针
它的大小是2个字节 它的大小是4个字节
它们的地址在0-65535之间(即在用户区中) 他们的地址超过65535(即超出用户区域)
例如:
简单的指针, 我们通常在C和C ++中进行研究
设备中使用的指针, 正在运行程序, 即通过此远指针攻击其他计算机。

Q.6为什么不存在"类型降级"而不是"类型提升"?而且, 与通过类型提升进行操作相比, 它将消耗更少的空间资源。

回答:让我们以一个例子来理解它。

double a = 1.5; int b = 10并且我们要计算a + b

通过降级类型, 浮点类型a将转换为int。因此, a = 1和a + b = 1 + 10 = 11, 但是我们知道正确答案是11.5, 这只能通过类型提升获得。因此, 结论是通过类型降级, 我们将无法获得正确的答案。

Q.7什么是栈区和堆区?

  1. 堆区:它用于动态分配的对象(使用malloc()和calloc())。
  2. 栈区:它用于存储方法的局部变量和参数。它仅在该特定方法终止之前一直保留在内存中。

请参考栈与堆内存有关详细信息。

Q.8 C中的#include和Java中的import之间的区别?

回答:

#include import
#include是不是关键字的语句。
 
而import是一个关键字。
它由预处理器软件处理。 它由编译器处理。
它增加了代码的大小。 它不会增加代码的大小。在这里, 即使我们写
导入java.lang。*;
它不会附加所有课程。而是将授予访问java.lang类的权限

Q.9 ++ * p, * p ++和* ++ p之间的区别?

1)前缀++和*的优先级相同。两者的关联性是从右到左。

2)后缀++的优先级高于*和前缀++。后缀++的关联性从左到右。

表达式++*p有两个相同优先级的操作符,因此编译器寻找结合性。运算符的结合性是从右到左的。因此,表达式被视为++(*p)。因此,第一个程序的输出是“arr[0] = 10, arr[1] = 20, *p = 11”。

表达式*p++被视为*(p++),因为后缀++的优先级高于*。因此第二个程序的输出是“arr[0] = 10, arr[1] = 20, *p = 20”。

表达式*++p有两个相同优先级的操作符,因此编译器寻找结合性。运算符的结合性是从右到左的。因此,表达式被视为*(++p)。因此第三个程序的输出是“arr[0] = 10, arr[1] = 20, *p = 20” 请参阅++*p、*p++及*++p之差异。

Q.10用示例解释深层复制和浅层复制吗?

在下面的C程序中,struct变量st1包含指向动态分配内存的指针。当将st1赋值给st2时,st2的str指针也开始指向相同的内存位置。这种复制被称为浅复制。

C

//C program to demonstrate shallow copy
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
 
struct test
{
   char *str;
};
 
int main()
{
   struct test st1, st2;
   st1.str = ( char *) malloc ( sizeof ( char ) * 20);
 
   strcpy (st1.str, "lsbin" );
 
   st2 = st1;
   st1.str[0] = 'X' ;
   st1.str[1] = 'Y' ;
 
   /* Since copy was shallow, both strings are same */
   printf ( "st1's str = %s\n" , st1.str);
   printf ( "st2's str = %s\n" , st2.str);
 
   return 0;
}

输出如下:

st1's str = XYeksforGeeks
st2's str = XYeksforGeeks

去做深拷贝, 我们为动态分配的成员分配新内存并显式复制它们。

C

//C program to demonstrate deep copy
# include <stdio.h>
# include <string.h>
# include <stdlib.h>
 
struct test
{
   char *str;
};
 
int main()
{
   struct test st1, st2;
   st1.str = ( char *) malloc ( sizeof ( char ) * 20);
 
   strcpy (st1.str, "lsbin" );
 
   st2 = st1;
 
   //We add extra statements to do deep copy
   st2.str = ( char *) malloc ( sizeof ( char ) * 20);
   strcpy (st2.str, st1.str);
 
   st1.str[0] = 'X' ;
   st1.str[1] = 'Y' ;
 
   /* Since copy was deep, both strings are different */
   printf ( "st1's str = %s\n" , st1.str);
   printf ( "st2's str = %s\n" , st2.str);
 
   return 0;
}

输出如下:

st1's str = XYeksforGeeks
st2's str = lsbin

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: