C语言面试问题

﹥>﹥吖頭↗ 提交于 2019-12-20 17:11:07

内容源自:C语言面试题大汇总

P.S.只摘取了自己觉得可能会被问到的以及不会的。

 

  •  static有什么用途?(请至少说明两种)

1.限制变量的作用域2.设置变量的存储域

  • 引用与指针有什么区别?

1) 引用必须被初始化,指针不必。2) 引用初始化以后不能被改变,指针可以改变所指的对象。3) 不存在指向空值的引用,但是存在指向空值的指针。

  • 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?  

全局变量储存在静态数据库,局部变量在堆栈

  • 不能做switch()的参数类型是:switch的参数不能为实型。
  • 局部变量能否和全局变量重名?

局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内

  • 如何引用一个已经定义过的全局变量?

extern
可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错

  • 全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?

可以,在不同的C文件中以static形式来声明同名全局变量。
可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错

  • static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
    static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
    static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
  • 程序的局部变量存在于(堆栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
  • Heap与stack的差别。
    Heap是堆,stack是栈。
    Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。
    Stack空间有限,Heap是很大的自由存储区
  • 一个32位的机器,该机器的指针是多少位
    指针是多少位只要看地址总线的位数就行了。80386以后的机子都是32的数据总线。所以指针的位数就是4个字节了。
  • 关键字static的作用是什么?
    定义静态变量
  • 关键字const有什么含意?
    表示常量不可以修改的变量。
  • 关键字volatile有什么含意?
    提示编译器对象的值可能在编译器未监测到的情况下改变。
  • c和c++中的struct有什么不同?
    c和c++中struct的主要区别是c中的struct不可以含有成员函数,而c++中的struct可以。c++中struct和class的主要区别在于默认的存取权限不同,struct默认为public,而class默认为private
  • 什么是预编译?

    预编译又称预处理,是整个编译过程最先做的工作,即程序执行前的一些预处理工作。主要处理#开头的指令。如拷贝#include包含的文件代码、替换#define定义的宏、条件编译#if等。

    何时需要预编译:

    1、总是使用不经常改动的大型代码体。

    2、程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

  • sizeof关键字的作用?

    sizeof是在编译阶段处理,且不能被编译为机器码。sizeof的结果等于对象或类型所占的内存字节数。sizeof的返回值类型为size_t。

    变量:int a;  sizeof(a)为4;

    指针:int *p;  sizeof(p)为4;

    数组:int b[10]; sizeof(b)为数组的大小,4*10;int c[0]; sizeof(c)等于0

    结构体:struct (int a; char ch;)s1; sizeof(s1)为8 与结构体字节对齐有关。

    注意:不能对结构体中的位域成员使用sizeof

    sizeof(void)等于1

    sizeof(void *)等于4

  • malloc/free与new/delete的区别

    1) malloc与free是C/C++语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。

    2) 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
    我们不要企图用malloc/free来完成动态对象的内存管理,应该用new/delete。由于内部数据类型的“对象”没有构造与析构的过程,对它们而言malloc/free和new/delete是等价的。

    3) 既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
    如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。如果用delete释放“malloc申请的动态内存”,结果也会导致程序出错,但是该程序的可读性很差。所以new/delete必须配对使用,malloc/free也一样。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!