📜  C编程面试常见问题套装3

📅  最后修改于: 2021-05-25 20:36:09             🧑  作者: Mango

Q.1写下最小的可执行代码?
Ans。 main是执行代码所必需的。代码是

C
void main()
{
}


C
// C program to demonstrate shallow copy
# include 
# include 
# include 
 
struct test
{
  char *str;
};
 
int main()
{
  struct test st1, st2;
  st1.str = (char *)malloc(sizeof(char) * 20);
 
  strcpy(st1.str, "GeeksforGeeks");
 
  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;
}


C
// C program to demonstrate deep copy
# include 
# include 
# include 
 
struct test
{
  char *str;
};
 
int main()
{
  struct test st1, st2;
  st1.str = (char *)malloc(sizeof(char) * 20);
 
  strcpy(st1.str, "GeeksforGeeks");
 
  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;
}


输出:

Q.2什么是入口控制和出口控制回路?
Ans。 C仅支持2个循环:

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

Q.3为什么预处理器指令最后没有分号?
Ans。编译器需要分号,顾名思义,预处理器是在编译之前处理我们的源代码的程序。因此,不需要分号。
Q.4包含带有尖括号<>的头文件和双引号”“之间的区别是什么?
Ans。如果<>中包含头文件,则编译器仅在内置包含路径中搜索特定的头文件。如果“”中包含头文件,则编译器将首先在当前工作目录中搜索特定的头文件,如果找不到,则在内置include路径中进行搜索。
Q.5近,远和巨大指针有什么区别?
Ans。这些是MS DOS时代在16位Intel体系结构中使用的一些旧概念,不再有用。
Near指针用于在16位计算机上的当前段中存储16位地址。局限性在于我们一次只能访问64kb的数据。
远端指针通常是32位,可以访问当前段外部的内存。要使用此功能,编译器会先分配一个段寄存器来存储段地址,然后再分配另一个寄存器来存储当前段内的偏移量。
像远指针一样,大指针通常也是32位的,并且可以访问外部段。在远指针的情况下,段是固定的。在远指针中,段部分无法修改,但在“巨大”中可以修改

Near Pointer Far Pointer
It’s size is 2 bytes Its size is 4 bytes
They have the address in between 0-65535(i.e in user area) They have the address more than 65535(i.e out of user area)
For Example:
simple pointers, which we normally studied in C and C++
Pointers which are used in devices, running program, i.e to attack on other computers via this far pointers.

Q.6为什么不存在“类型降级”而不是“类型提升”?而且,与通过类型提升进行操作相比,它将消耗更少的空间资源。
Ans。让我们以一个例子来理解它。
认为
双倍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之间的区别?
Ans。

#include import
#include is a statement not a keyword. 
 
While import is a keyword.
It is processed by pre-processor software. It is processed by compiler.
It increases the size of the code. It doesn’t increases the size of the code. Here, even if we write 
import java.lang.*; 
it will not attach all the class. Rather it will give permission to access the class of 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程序中,结构变量st1包含指向动态分配的内存的指针。当我们将st1分配给st2时,st2的str指针也开始指向相同的内存位置。这种复制称为“浅复制”

C

// C program to demonstrate shallow copy
# include 
# include 
# include 
 
struct test
{
  char *str;
};
 
int main()
{
  struct test st1, st2;
  st1.str = (char *)malloc(sizeof(char) * 20);
 
  strcpy(st1.str, "GeeksforGeeks");
 
  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

要进行Deep Copy ,我们为动态分配的成员分配新内存,并显式复制它们。

C

// C program to demonstrate deep copy
# include 
# include 
# include 
 
struct test
{
  char *str;
};
 
int main()
{
  struct test st1, st2;
  st1.str = (char *)malloc(sizeof(char) * 20);
 
  strcpy(st1.str, "GeeksforGeeks");
 
  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 = GeeksforGeeks

相关文章:

1. https://www.geeksforgeeks.org/commonly-asked-c-programming-interview-questions-set-1/
2. https://www.geeksforgeeks.org/commonly-asked-c-programming-interview-questions-set-2/

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。