Technology C C - chaolunner/CloudNotes GitHub Wiki
- 安装 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的数据类型的大小。
- 间接赋值是指针存在的最大意义。
- 分配内存的位置: 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不会。
注意,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 一个指向常整数的常指针(指针和它所指向的内存空间,均不能被修改)
}