C/C++面试八股题(九)
更多专栏:
超详细的嵌入式面经专栏(适用于小白学习和大佬复习):https://www.nowcoder.com/creation/manager/columnDetail/mGYoDz
校招公司汇总专栏:https://www.nowcoder.com/creation/manager/columnDetail/0ybKdp
目录:
1.请你简单说说数组存放在哪里?
2.请你介绍一下c/c++中变量的作用域都有哪些?
3.请问sizeof与strlen的区别,简单说说?
4.简述C++有几种传值方式之间的区别?
5.指针用的多不,请问数组指针与指针数组的区别?
6.请问NULL和nullptr区别?
内容:
1.请你简单说说数组存放在哪里?
栈
- 当数组是作为局部变量定义在函数中时,数组会存放在栈中。
- 栈中的数组内存是自动分配和释放的,由编译器完成。
- 数组在函数结束后,栈上的内存会被回收。
- 栈的大小是有限的,通常在几 MB 左右,不能分配太大的数组。
例子
void func() { int* arr = (int*)malloc(sizeof(int) * 10); // 动态分配,存放在堆中 arr[0] = 42; free(arr); // 释放堆内存 }
堆
- 当使用动态分配(如
malloc
、calloc
或new
)创建数组时,数组存放在堆中。 - 堆中的数组内存是手动分配和释放的,需要程序员显式调用
free
或delete
释放内存。 - 堆的大小一般远大于栈,适合分配较大的数组。
例子:
void func() { int* arr = (int*)malloc(sizeof(int) * 10); // 动态分配,存放在堆中 arr[0] = 42; free(arr); // 释放堆内存 }
数据段
- 数据段分为 全局/静态区 和 BSS段,具体取决于变量是否被初始化。
- 如果数组是全局变量,或者被
static
修饰且已初始化,会存储在 数据段的已初始化区。 - 程序运行时全程有效。
- 这些数组会在程序加载时分配,并且内存初始化为指定的值。
int arr[3] = {1, 2, 3}; // 全局数组,存储在数据段的已初始化区 static int s_arr[3] = {4, 5, 6}; // 静态数组,存储在数据段的已初始化区
- 如果数组是全局变量或被
static
修饰且未初始化,则存储在 BSS段。 - BSS段的数组会在程序加载时分配,并自动初始化为全 0。
int arr[3]; // 全局数组,未初始化,存储在BSS段 static int s_arr[3]; // 静态数组,未初始化,存储在BSS段
代码段
- 如果数组是用
const
修饰的,并且是只读数据(常量数组),通常存放在 代码段的只读区 或 常量区。 - 这些数组是只读的,不能被修改。
const char str[] = "Hello, world!"; // 字符常量数组,可能存储在代码段或常量区
总结
数组类型 |
存储位置 |
局部数组(自动分配) |
栈 |
动态分配的数组 |
堆 |
全局/静态数组(已初始化) |
数据段(已初始化区) |
全局/静态数组(未初始化) |
数据段(BSS段) |
|
代码段或常量区 |
2.请你介绍一下c/c++中变量的作用域都有哪些?
块作用域
- 变量在某个代码块
{}
内声明,只在该代码块中可见,出了代码块就无法访问。 - 代码块内的变量是局部变量。
- 代码块外无法访问代码块内的变量。
- 变量作用域以
{
开始,以}
结束。 - 在函数、循环、条件语句等代码块中定义的变量。
例子:
void example() { int x = 10; // x 的作用域从这里开始 { int y = 20; // y 的作用域从这里开始 printf("x = %d, y = %d\n", x, y); } // printf("%d\n", y); // 错误,y 超出作用域 }
函数作用域
- 函数作用域表示变量仅在函数内可见。变量在函数内部声明,只能在同一函数内访问。函数作用域的变量在函数执行时创建,在函数结束时销毁。
例子:
void func1() { int x = 10; // x 的作用域只在 func1 内 } void func2() { int y = 20; // y 的作用域只在 func2 内 // printf("%d\n", x); // 错误,x 不在作用域内 }
全局作用域
- 全局作用域表示变量在整个程序中都可见。在任何函数或代码块之外声明的变量都具有全局作用域。这些变量在程序开始执行时创建,在程序结束时销毁。
例子:
#include <iostream> int x = 10; // 全局变量 int main() { std::cout << x << std::endl; // 输出:10 return 0; }
在上面的例子中,变量x在main函数中被访问,因为它具有全局作用域。
类作用域
- 在类或结构体中声明的变量,其作用域限制在类的范围内。
- 成员变量和成员函数都属于类作用域。
- 私有成员(
private
)只能在类内部访问。 - 公共成员(
public
)可以通过类对象访问。 - 使用
::
作用域解析符可以访问静态成员变量或成员函数。
例子:
class MyClass { private: int private_var; // 私有成员,仅在类内部可见 public: int public_var; // 公有成员,可以通过对象访问 void display() { private_var = 10; // 类内访问私有成员 std::cout << "Private Var: " << private_var << std::endl; } }; int main() { MyClass obj; obj.public_var = 20; // 可以访问公有成员 // obj.private_var = 10; // 错误,私有成员不可直接访问 }
命名空间作用域
- 在命名空间中定义的变量,其作用域限制在命名空间内。
- 通过
namespace
定义。 - 命名空间中的变量和函数不会与其他命名空间冲突。
- 可以通过
using namespace
或namespace::name
来访问。
例子:
namespace MyNamespace { int x = 10; // 命名空间作用域 } int main() { std::cout << MyNamespace::x << std::endl; // 使用作用域解析符 return 0; }
函数参数的作用域
- 函数参数也具有自己的作用域,它们在函数内部有效。函数参数作用域指的是这些参数在整个函数内部可见。
例子:
int x = 10; // 全局变量 void func(int x) { // 函数参数 printf("%d\n", x); // 输出函数参数 x 的值 } int main() {
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
嵌入式/C++八股 文章被收录于专栏
本人双飞本,校招上岸广和通。此专栏覆盖嵌入式常见面试题,有C/C++相关的知识,数据结构和算法也有嵌入式相关的知识,如操作系统、网络协议、硬件知识。本人也是校招过来的,大家底子甚至项目,可能都不错,但是在面试准备中常见八股可能准备不全。此专栏很适合新手学习基础也适合大佬备战复习,比较全面。最终希望各位友友们早日拿到心仪offer。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新