Technology C C - chaolunner/CloudNotes GitHub Wiki

如何使用Visual Studio Code运行C++项目

  • 安装 VS Code
  • 安装C++扩展包
  • 在 Visual Studio Installer 中安装 使用 c++ 的游戏开发 模块。
  • 打开 x64 Native Tools Command Prompt for VS 2017 控制台。
  • 使用 cd <project path> 命令行,跳转到项目目录下。
  • 使用 code . 命令行来启动 Visual Studio Code (非常重要,必须这样打开)。
  • 使用 Terminal > Configure Default Build Task,来创建 tasks.json
  • 使用 Terminal > Tasks: Run Build Task,来构建 .exe 可运行文件。
  • 使用 Debug > Add Configuration...,来创建 launch.json
  • 使用 Debug > Start Debugging 进行调试。

内存四区

内存四区建立流程:

流程说明:

  • 操作系统把物理硬盘代码load到内存。
  • 操作系统把c代码分成四个区。
  • 操作系统找到main函数入口执行。

各区元素分析:

指针铁律

  • 指针也是变量,占有4个字节的内存空间,用来保存内存地址。
  • *p操作内存
    • 在指针声明时,*号表示所声明的变量为指针。
    • 在指针使用时,*号表示 操作 指针所指向的内存空间中的值。
    • *p相当于通过地址(p变量的值)找到内存,然后操作内存。
    • *p放到等号的左边赋值(给内存赋值)。
    • *p放到等号的右边取值(从内存取值)。
  • 指针变量和它指向的内存块是两个不同的概念。
    • 给p赋值,只会改变指针变量的值,并不会改变所指向的内容。
    • 给*p赋值,不会改变指针变量的值,只会改变所指向的内存块的值。
  • 指针是一种数据类型,是指它指向的内存空间的数据类型。
    • 指针步长(p++),根据所致内存空间的数据类型来确定。
    • p++ = 指针p的内存地址值+指针p的数据类型的大小。
  • 间接赋值是指针存在的最大意义。

参考案例1

new/delete和malloc/free基本区别

  • 分配内存的位置: malloc在堆上分配内存,但new其实不能说是在堆上,C++中,对new申请内存位置有一个抽象概念,它为自由存储区,它可以在堆上,也可以在静态存储区上分配,这主要取决于operator new实现细节,取决与它在哪里为对象分配空间。
  • 内存申请成功的返回值: new返回完整类型指针,malloc则返回void*。
  • 内存申请失败的返回值: 申请内存失败,new默认抛出异常,malloc则返回NULL。
  • 分配内存的大小: new可以由编译器根据类型计算得出,malloc需要用户计算数据类型的大小后进行内存分配。
  • 处理数组: new有明确的方式处理数组的分配,即new[],释放也有delete[],malloc需要用户计算数组的大小后进行内存分配。
  • 已分配内存的扩充: malloc可利用realloc重新分配内存,new不可以。
  • 是否可以相互调用: new可以,看具体的operator new/delete实现,malloc则不能调用new。
  • 调用内存时内存不足: new能够指定处理函数或重新制定分配器,malloc则无法通过代码进行处理。
  • 函数重载(malloc是标准库函数,new是C++的运算符): new可以被重载,但malloc不可以,malloc需要库函数的支持,new不需要。
  • 构造函数与析构函数: new和delete会自动调用构造函数和析构函数,但是malloc和free不会。

const基础知识

注意,C语言中const修饰的变量依旧可以被改变(不会报错),但你不应该这样做。

int main()
{
  // a,b 都代表一个常整形数
  const int a;
  int const b;

  const char *c; // c 是一个指向常整数的指针(所指向的内存数据不能被修改,但本身可以修改)
  char * const d; // d 常指针(指针变量不能被修改,但是它所指向的内存空间可以被修改)
  const char * const e; // e 一个指向常整数的常指针(指针和它所指向的内存空间,均不能被修改)
}
⚠️ **GitHub.com Fallback** ⚠️