### C语言基本概念及其辨析 #### 1. 关键字`static`的作用 在C语言中,关键字`static`有三个主要作用: - **在函数体内:** 当一个变量被声明为静态(`static`)时,在函数调用过程中,该变量的值在函数退出后仍保持不变。这意味着即使函数返回,下次再调用该函数时,静态变量依然保留上次调用结束时的值。 - **在模块内(但在函数体外):** 如果一个变量在模块内(即文件内)被声明为静态,则它可以被该模块内的所有函数访问,但不能被其他模块的函数访问。这种变量称为“本地全局变量”或“模块级静态变量”。 - **在模块内的函数声明:** 如果一个函数在模块内被声明为静态,则该函数只能被该模块内的其他函数调用,不能被其他模块的函数调用。这使得该函数的作用域被限制在声明它的模块内部。 #### 2. 引用和指针的区别 C语言中没有引用的概念,这里提到的“引用”实际上是C++中的特性,但为了理解方便,我们可以将其与C语言中的指针进行比较: - **初始化:** 引用必须在定义时初始化,并且一旦初始化就不能更改引用的对象;而指针可以在定义时不初始化,之后可以随时改变所指向的对象。 - **空值:** 引用必须引用一个对象,不存在指向空值的引用;指针则可以指向空值。 - **改变指向:** 引用初始化后不能更改引用的对象;指针可以通过赋值操作改变指向的对象。 #### 3. .h头文件中的`ifndef/define/endif`的作用 `ifndef/define/endif`的作用是防止头文件被重复包含。具体来说,当头文件首次被包含时,预处理指令会检查宏是否已被定义。如果没有定义,则定义该宏并包含头文件的内容;如果已经定义,则跳过该头文件的内容,从而避免了重复定义的问题。 #### 4. `#include <file.h>`与`#include "file.h"`的区别 - `#include <file.h>`:此形式通常用于包含标准库头文件。编译器会在标准系统目录下搜索指定的文件。 - `#include "file.h"`:此形式用于包含用户自定义的头文件。编译器首先在当前源文件所在目录下搜索指定的文件,如果找不到,则再到标准系统目录下搜索。 #### 5. 全局变量与局部变量在内存中的区别 - **全局变量**:存储在静态数据区中,其生命周期贯穿整个程序运行过程。 - **局部变量**:存储在栈中,其生命周期仅限于函数的执行过程。 #### 6. 堆栈溢出的原因 - **没有回收垃圾资源**:例如在循环中不断分配内存而没有释放,最终导致内存耗尽。 - **层次太深的递归调用**:递归调用会不断消耗栈空间,如果递归深度过大,会导致栈空间不足。 #### 7. 不能声明为虚函数的函数 在C++中,构造函数不能声明为虚函数,这是因为构造函数主要用于初始化对象,而虚函数是为了实现多态性,构造函数无法在派生类中重写。 #### 8. 队列与栈的区别 - **队列**:先进先出(FIFO)原则,新元素添加到队尾,删除操作发生在队首。 - **栈**:后进先出(LIFO)原则,新元素添加和删除都在栈顶进行。 #### 9. 不能作为`switch()`参数的类型 `switch()`语句的参数不能为浮点数或双精度数等实数类型,只能接受整数类型或枚举类型的值。 #### 10. 局部变量和全局变量能否重名 可以重名。当局部变量与全局变量同名时,局部变量会覆盖全局变量,即局部变量在函数内部优先级更高。如果需要使用全局变量,则需要使用作用域解析运算符`::`。 #### 11. 如何引用一个已经定义过的全局变量 可以通过以下两种方式引用已定义的全局变量: - **引用头文件**:如果全局变量在头文件中声明,可以通过包含该头文件来引用全局变量。 - **使用`extern`关键字**:通过声明一个外部变量来引用全局变量,这种方式允许在不定义的情况下使用变量。 #### 12. 语句`for(;;)`的意义 `for(;;)`表示一个无限循环,相当于`while(true)`。循环条件永远为真,因此除非在循环体内部有显式的`break`或`return`语句,否则循环将持续执行。 #### 13. 程序的内存分配 - **栈区**:用于存储函数的参数值和局部变量。 - **堆区**:用于动态分配内存,如通过`malloc()`、`calloc()`等函数分配的内存。 - **全局区**:用于存储全局变量和静态变量。 - **文字常量区**:用于存储字符串常量等不可变的数据。 - **程序代码区**:用于存储程序的机器码。 #### 14. 三种基本的数据模型 根据数据结构的不同,数据模型可以划分为: - **层次模型**:采用树形结构表示实体及实体间的联系。 - **网状模型**:允许一对多的关系,形成网状结构。 - **关系模型**:采用二维表格的形式表示实体及实体之间的联系。 #### 15. 结构和联合的区别 - **结构**:结构体是由多个不同数据类型的成员组成的集合,每个成员都有自己的存储空间,因此结构体中所有成员同时存在。 - **联合**:联合体也是由多个不同数据类型的成员组成的集合,但所有成员共享同一块存储空间,因此任何时候只有一个成员被激活。 #### 16. 内存分配方式及其区别 - **静态存储区域分配**:在程序编译时就分配好的内存,这部分内存在整个程序运行期间都存在,例如全局变量和静态变量。 - **栈上创建**:在函数执行时为局部变量分配的内存,函数执行结束后自动释放。 - **从堆上分配**:动态分配的内存,通过函数如`malloc()`分配,需手动释放。
- 粉丝: 7
- 资源: 878
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助