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);  // 释放堆内存
}

  • 当使用动态分配(如 malloccallocnew)创建数组时,数组存放在堆中。
  • 堆中的数组内存是手动分配和释放的,需要程序员显式调用 freedelete 释放内存。
  • 堆的大小一般远大于栈,适合分配较大的数组。

例子:

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段)

const修饰的只读数组

代码段或常量区

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 namespacenamespace::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。也希望大家点点赞,收藏,送送小花。这是对我的肯定和鼓励。 持续更新

全部评论
完结撒花,希望功夫不负有心人
1 回复 分享
发布于 01-05 09:10 山东
加更加更
点赞 回复 分享
发布于 01-21 17:28 陕西

相关推荐

评论
12
18
分享

创作者周榜

更多
牛客网
牛客企业服务