面试题1:变量的声明和定义有什么区别 为变量分配地址和存储空间的称为定义,不分配地址的称为声明。一个变量可以在多个地方声明, 但是只在一个地方定义。加入extern修饰的是变量的声明,说明此变量将在文件以外或在文件后面部分 定义。 说明:很多时候一个变量,只是声明不分配内存空间,直到具体使用时才初始化,分配内存空间, 如外部变量。 面试题2:写出bool 、int、 float、指针变量与“零值”比较的if 语句 ### C/C++经典面试题详解 #### 面试题1:变量的声明和定义有什么区别? **声明**和**定义**是C/C++中非常重要的概念。了解它们之间的区别对于编写高质量的代码至关重要。 - **定义**: 当我们说一个变量被定义时,这意味着为其分配了实际的内存空间。定义通常包括初始值的赋值。每个变量在其生命周期内只能有一个定义位置。 ```c int x = 10; // 定义变量x并初始化 ``` - **声明**: 声明仅仅告诉编译器变量的存在及其类型,但不会为它分配任何内存空间。一个变量可以在多个地方声明,只要它在某个地方被定义过即可。 ```c extern int x; // 声明变量x ``` **extern关键字**: 当使用`extern`关键字时,它表示该变量将在当前文件之外或者后面的代码中定义。例如: ```c extern int x; // 在其他地方定义 // ... int x = 10; // 实际定义位置 ``` 这种情况下,`extern int x;`是声明,而`int x = 10;`则是定义。 **注意**: 外部变量或全局变量常常只在一处定义,但在多个地方声明,这是为了提高代码的模块化和可维护性。 #### 面试题2:写出bool、int、float、指针变量与“零值”比较的if语句 在C/C++中,布尔型、整型、浮点型和指针类型的变量可以通过if语句与零值进行比较,以检查它们是否等于零或某个特定值。 - **bool型数据**: ```c bool flag = false; if (flag) { // flag为true时执行 } else { // flag为false时执行 } ``` - **int型数据**: ```c int flag = 0; if (flag != 0) { // flag不等于0时执行 } else { // flag等于0时执行 } ``` **注意**: 对于整型变量,推荐使用`!= 0`而不是简单的`flag`,以增加代码的清晰度。 - **指针型数据**: ```c int *ptr = nullptr; if (ptr == nullptr) { // ptr为空指针时执行 } else { // ptr非空时执行 } ``` **注意**: 使用指针时,推荐将`nullptr`放在等号的左侧,以防将`=`误写为`==`时,编译器能够捕获到错误。 - **float型数据**: ```c float flag = 0.0f; const float EPSILON = 1e-6f; if (fabs(flag) < EPSILON) { // flag接近于0时执行 } else { // flag不接近于0时执行 } ``` **注意**: 浮点数的比较不能直接使用`==`,因为浮点数的运算可能存在舍入误差。通常使用一个小的正数`EPSILON`来判断两个浮点数是否足够接近。 #### 面试题3:sizeof和strlen的区别 **sizeof**和**strlen**都是用于获取大小或长度的工具,但它们之间存在明显的差异。 - **sizeof**: 是一个操作符,用于计算变量或数据类型所占用的内存大小。 - 参数可以是数据类型,也可以是变量。 - 在编译时就能确定其结果。 - 计算的是数据类型本身所占的内存大小,与变量的实际值无关。 ```c int x; size_t sizeOfX = sizeof(x); // 获取x所占的内存大小 ``` - **strlen**: 是一个库函数,用于计算以空字符'\0'结尾的字符串的长度。 - 参数必须是字符串。 - 只能在运行时计算结果。 - 计算的是字符串实际的长度,不包括结尾的空字符。 ```c char str[] = "Hello"; size_t len = strlen(str); // 获取str的长度 ``` **注意**: 在使用数组作为参数时,`sizeof`不会将其退化为指针,而`strlen`则会。 #### 面试题4:C语言的关键字static和C++的关键字static有什么区别 在C和C++中,`static`关键字具有不同的用途。 - **C语言**: - 用于局部变量,使其在整个程序执行过程中保持其最后的值。 - 用于全局变量或函数,限制其作用域仅限于当前源文件。 ```c static int count = 0; // 局部静态变量 ``` - **C++语言**: - 继承了C语言中的功能。 - 可以定义类的静态成员变量和静态成员函数。 ```cpp class MyClass { public: static int count; // 静态成员变量 static void incrementCount(); // 静态成员函数 }; int MyClass::count = 0; void MyClass::incrementCount() { ++count; } ``` **注意**: `static`在C++中增强了类的功能,使得静态成员可以在多个对象实例间共享。 #### 面试题5:C中的malloc和C++中的new有什么区别 **malloc**和**new**都是用于动态内存分配的重要工具,但它们在C和C++中有明显的区别。 - **malloc**: 是一个函数,用于从堆中分配内存块。 - 位于`<stdlib.h>`头文件。 - 不执行构造函数。 - 返回`void*`类型的指针。 ```c int *arr = (int*) malloc(10 * sizeof(int)); ``` - **new**: 是一个操作符,用于创建对象或分配内存。 - 只能在C++中使用。 - 能够自动调用构造函数。 - 返回指定类型的指针。 ```cpp int *arr = new int[10]; ``` **注意**: 使用`malloc`分配的内存需要用`free`释放;使用`new`分配的内存需要用`delete`释放。 #### 面试题6:写一个“标准”宏MIN 宏定义可以用来实现简洁的代码重用。以下是一个常用的最小值宏定义: ```c #define MIN(a, b) ((a) <= (b) ? (a) : (b)) ``` **注意**: 使用宏定义时要小心,因为它可能会引入副作用。例如,在宏定义中使用自增操作符时,可能引起问题。 ```c int p = 10; int x = 20; int minVal = MIN(++p, x); // 错误使用,p会被自增两次 ``` #### 面试题7:一个指针可以是volatile吗 **volatile**关键字用于告诉编译器,变量的值可能会被程序外部的因素改变。 - **指针可以是volatile**: - 表示该指针所指向的数据可能会被外部因素改变。 - 通常用于多线程环境或硬件接口编程。 ```c volatile int *ptr; ``` **注意**: 指针本身不是volatile,而是指针所指向的数据可能是volatile。 #### 面试题8:a和&a有什么区别 理解数组名和取地址运算符的区别对于编写安全可靠的C/C++代码至关重要。 ```c #include <stdio.h> int main() { int a[5] = {1, 2, 3, 4, 5}; int *ptr = (int*)(&a + 1); printf("%d, %d\n", *(a + 1), *(ptr - 1)); return 0; } ``` **输出结果**: 2, 5 - **a**: 数组名,等同于数组的首地址。 - **&a**: 数组的地址。 当我们将`&a + 1`转换为指针时,实际上是指向数组`a`的下一个元素的地址。因此,`*(ptr - 1)`访问的是数组`a`的最后一个元素。 #### 面试题9:简述C、C++程序编译的内存分配情况 C/C++程序的内存分配通常可以分为以下几个区域: 1. **静态存储区域**: - 内存是在程序编译时就已经分配好的。 - 整个程序运行期间都存在。 - 例如全局变量、静态变量等。 2. **栈**: - 用于存储局部变量和函数参数。 - 函数调用时分配,函数结束时释放。 3. **堆**: - 动态分配内存,由程序员手动管理。 - 通过`malloc`、`new`等函数分配,`free`、`delete`等函数释放。 4. **常量存储区**: - 存储常量字符串和常量数据。 - 不允许修改。 5. **未初始化的数据段**: - 用于存放未初始化的全局变量和静态变量。 通过以上介绍,我们可以更好地理解和掌握C/C++中的一些核心概念和技术细节,这对于成为一名合格的软件开发者至关重要。





















剩余25页未读,继续阅读

- oShuiZhongYue1234562013-01-08谢谢 里面有好几个问题 我都被问到了,谢谢lz的慷慨 ^_^
- jackyying1232012-12-02比较基础,还是比较适合初学者

- 粉丝: 47
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- IPV网络安全技术研究.doc
- Oracle-RAC技术详解-SecureFile.doc
- 信息系统安全集成操作规范.doc
- 基于大数据视角下商业银行风险管理问题探究.docx
- 软件项目管理-C-可行性研究.ppt
- 挣值分析法在工程项目管理的应用.docx
- 基于计算机软件技术的智能机器人系统应用研究.docx
- PLC-变频器在恒压供水上的应用.doc
- 试论计算机主机隐秘信息的取证技术.docx
- 建工版《建设工程项目管理》教材及重点注释(第章)-secret.doc
- 12自动化PLC物料分拣系统课程设计方案报告.doc
- 《操作系统修炼手册:从技巧到实战的进阶指南》,详细介绍Linux常用命令、线程同步机制、通信实现方式及实战项目
- 天元大数据平台介绍.pptx
- 桌面虚拟化技术在机房建设中的研究与实践.docx
- -数据库设计思路计算机软件及应用IT计算机专业资料.ppt
- “人工智能+”小学信息技术教学-(5).doc


