diff --git a/docs/notes/01_c-basic/00_xdx/index.md b/docs/notes/01_c-basic/00_xdx/index.md index af98517..038f1eb 100644 --- a/docs/notes/01_c-basic/00_xdx/index.md +++ b/docs/notes/01_c-basic/00_xdx/index.md @@ -1,3 +1,10 @@ +> [!IMPORTANT] +> +> * ① C 语言是一门`面向过程`的`编译型`的`编程语言`,其最大特点在于 `运行速度极快`,仅次于`汇编语言`,这使得 C 语言在需要高性能的场景中得到广泛应用,如:操作系统、硬件驱动程序和嵌入式系统。然而,`开发效率较低`也是 C 语言的一大特点,程序员需要手动管理内存和处理低级别的操作,这对编程能力要求较高。 +> * ② C 语言不仅仅是一门`编程`语言,更是计算机行业的`核心`语言。它是计算机专业的基础课程,无论是操作系统的构建、硬件驱动的开发,还是数据库系统的实现,都离不开 C 语言的支持。`学习 C 语言` 不仅是掌握编程技能的必经之路,也是深入理解计算机底层原理的关键。如果忽视了 C 语言的学习,将难以深入理解计算机系统的工作原理,也很难在计算机行业中取得长远的发展。 + + + # 第一章:计算机组成原理 ## 1.1 计算机系统 @@ -30,15 +37,10 @@ * `冯·诺依曼`体系结构的理论要点如下: - ① **存储程序**:`程序指令`和`数据`都存储在计算机的内存中,这使得程序可以在运行时修改。 - - ② **二进制逻辑**:所有`数据`和`指令`都以`二进制`形式表示。 - - ③ **顺序执行**:指令按照它们在内存中的顺序执行,但可以有条件地改变执行顺序。 - - ④ **五大部件**:计算机由`运算器`、`控制器`、`存储器`、`输入设备`和`输出设备`组成。 - - ⑤ **指令结构**:指令由操作码和地址码组成,操作码指示要执行的操作,地址码指示操作数的位置。 - - ⑥ **中心化控制**:计算机的控制单元(CPU)负责解释和执行指令,控制数据流。 @@ -48,9 +50,9 @@ > > 上述的组件协同工作,构成了一个完整的计算机系统: > -> * **运算器**和**控制器**通常被集成在一起,组成中央处理器(CPU),负责数据处理和指令执行。 -> * **存储器**保存数据和程序,是计算机运作的基础。 -> * **输入设备**和**输出设备**负责与外界的交互,确保用户能够输入信息并接收计算机的处理结果。 +> * `运算器`和`控制器`通常被集成在一起,组成中央处理器(CPU),负责数据处理和指令执行。 +> * `存储器`(内存)保存数据和程序,是计算机运作的基础。 +> * `输入设备`和`输出设备`负责与外界的交互,确保用户能够输入信息并接收计算机的处理结果。 ## 1.3 各种硬件处理速度和性能优化 @@ -428,7 +430,7 @@ int main() { // 定义主函数 > [!NOTe] > -> * C 语言毕竟诞生的时间非常早(20 世纪 70 年代),属于 70 后了,有点落后于现在的时代,虽然执行效率高,但是开发效率低。 +> * C 语言毕竟诞生的时间非常早(20 世纪 70 年代),属于 70 后了,有点落后于现在的时代,虽然执行效率高(仅次于汇编语言),但是开发效率低。 > * 随着时间的推移,人们在 C 语言的基础上增加了面向对象的机制([软件危机](https://zh.wikipedia.org/wiki/%E8%BD%AF%E4%BB%B6%E5%8D%B1%E6%9C%BA)),形成了一门新的编程语言,它的名字是 C++ 。 > * 但是,C++ 的特性实在是太多了(因为 C++ 兼容 C,并增加了很多自己独有的特性,可以是当今最复杂的编程语言,没有之一),于是人们在 C++ 的基础上,删减了一些非必要的特性,就形成了 Java 和 C# ,也可以认为 Java 和 C# 是 C++--。 > * 当然,近年来,Go 语言也很火,它的设计者之一就是 `Unix` 操作系统的的开发者`肯·汤姆森`(Ken Thompson),Go 诞生的背景据说是`肯·汤姆森`(Ken Thompson)在 C++ 委员会在为其演讲 C++ 新特性的时候,觉得 C++ 新特性太多太复杂,于是就开发了 Go 语言;所以,Go 语言中有很多 C 语言的身影。 diff --git a/docs/notes/01_c-basic/06_xdx/index.md b/docs/notes/01_c-basic/06_xdx/index.md index adf8b3a..8b48268 100644 --- a/docs/notes/01_c-basic/06_xdx/index.md +++ b/docs/notes/01_c-basic/06_xdx/index.md @@ -1,5 +1,7 @@ -> * `指针`是 C 语言中`最重要`的概念之一,也是`最难以理解`的概念之一。 -> * `指针`是 C 语言的`精髓`,要想掌握 C 语言就需要深入地了解指针。 +> [!IMPORTANT] +> +> * ① `指针`是 C 语言中`最重要`的概念之一,也是`最难以理解`的概念之一。 +> * ② `指针`是 C 语言的`精髓`,要想掌握 C 语言就需要深入地了解指针。 @@ -14,15 +16,15 @@ > 之所以指针在 C 语言中颇具争议,是因为一方面其功能强大,直接操作内存地址;另一方面,又很危险,不正确的使用指针的方式,非常容易导致程序崩溃。 * 如果没有能很好的使用指针,就会带来一系列的问题,如: - * ① **空指针引用(Null Pointer Dereference)**:当一个指针没有正确初始化或者被赋予了空(NULL)值时,如果程序尝试访问该指针所指向的内存,会导致运行时错误,甚至导致程序崩溃。 - * ② **野指针(Dangling Pointers)**:指针指向的内存地址曾经分配给某个变量或对象,但后来该变量或对象被释放或者移动,导致指针仍指向已经无效的内存位置。对野指针进行操作可能会导致未定义的行为或程序崩溃。 - * ③ **指针算术错误**:在进行指针运算时,如果没有正确管理指针的偏移量或者超出了数组的边界,可能会导致指针指向错误的内存位置,从而影响程序的正确性和安全性。 - * ④ **内存泄漏**:如果动态分配的内存通过指针分配,但在不再需要时没有正确释放,会导致内存泄漏,长时间运行的程序可能会耗尽系统资源。 + * ① `空指针引用`(Null Pointer Dereference):当一个指针没有正确初始化或者被赋予了空(NULL)值时,如果程序尝试访问该指针所指向的内存,会导致运行时错误,甚至导致程序崩溃。 + * ② `野指针`(Dangling Pointers):指针指向的内存地址曾经分配给某个变量或对象,但后来该变量或对象被释放或者移动,导致指针仍指向已经无效的内存位置。对野指针进行操作可能会导致未定义的行为或程序崩溃。 + * ③ `指针算术错误`:在进行指针运算时,如果没有正确管理指针的偏移量或者超出了数组的边界,可能会导致指针指向错误的内存位置,从而影响程序的正确性和安全性。 + * ④ `内存泄漏`:如果动态分配的内存通过指针分配,但在不再需要时没有正确释放,会导致内存泄漏,长时间运行的程序可能会耗尽系统资源。 * 为了减少指针带来的风险,开发人员可以采取以下的措施: - * ① **良好的编程实践**:确保指针的初始化和使用是安全的,避免空指针引用和野指针问题。 - * ② **边界检查**:在进行指针运算时,始终确保不会超出数组或内存分配的边界。 - * ③ **使用指针和引用的适当性**:在可能的情况下,可以考虑使用更安全的语言特性,如:引用(在 C++ 等编程语言中)或者更高级别的数据结构来代替裸指针,从而减少指针使用时的潜在风险。 + * ① `良好的编程实践`:确保指针的初始化和使用是安全的,避免空指针引用和野指针问题。 + * ② `边界检查`:在进行指针运算时,始终确保不会超出数组或内存分配的边界。 + * ③ `使用指针和引用的适当性`:在可能的情况下,可以考虑使用更安全的语言特性,如:引用(在 C++ 等编程语言中)或者更高级别的数据结构来代替裸指针,从而减少指针使用时的潜在风险。 > [!IMPORTANT] > @@ -34,20 +36,20 @@ ## 1.2 现代化高级编程语言是如何解决指针危险的? * `C++`采用了如下的策略和机制,来解决指针危险操作的: - * ① **智能指针:** C++ 引入了智能指针(如`std::shared_ptr`、`std::unique_ptr`),这些指针提供了自动资源管理和所有权的语义。`std::unique_ptr`确保只有一个指针可以访问给定的资源,从而避免了传统指针的悬空引用和内存泄漏问题。`std::shared_ptr`允许多个指针共享一个资源,并在所有引用释放后自动释放。 - * ② **引用:** C++ 中的引用(如:`&`符号)提供了更安全的间接访问方法,与指针相比,引用不能重新绑定到不同的对象,从而减少了意外的指针错误。 + * ① `智能指针`: C++ 引入了智能指针(如`std::shared_ptr`、`std::unique_ptr`),这些指针提供了自动资源管理和所有权的语义。`std::unique_ptr`确保只有一个指针可以访问给定的资源,从而避免了传统指针的悬空引用和内存泄漏问题。`std::shared_ptr`允许多个指针共享一个资源,并在所有引用释放后自动释放。 + * ② `引用`: C++ 中的引用(如:`&`符号)提供了更安全的间接访问方法,与指针相比,引用不能重新绑定到不同的对象,从而减少了意外的指针错误。 * `Go`采用了如下的策略和机制,来解决指针危险操作的: - * ① **内存管理和垃圾回收:** Go 语言通过自动垃圾回收器管理内存,减少了手动内存管理所带来的指针操作错误。Go 的垃圾回收器定期扫描并释放不再使用的内存,避免了内存泄漏和悬空指针问题。 - * ② **指针的安全性:** Go 语言的指针是受限的,不支持指针运算,从而减少了指针操作可能带来的风险。 + * ① `内存管理和垃圾回收`: Go 语言通过自动垃圾回收器管理内存,减少了手动内存管理所带来的指针操作错误。Go 的垃圾回收器定期扫描并释放不再使用的内存,避免了内存泄漏和悬空指针问题。 + * ② `指针的安全性`: Go 语言的指针是受限的,不支持指针运算,从而减少了指针操作可能带来的风险。 * `Rust`采用了如下的策略和机制,来解决指针危险操作的: - * ① **所有权和借用:** Rust 引入了所有权和借用的概念,编译器在编译时静态分析所有权转移和引用的生命周期。这种机制避免了数据竞争和空指针解引用等运行时错误,使得在编译时就能够保证内存安全。 - * ② **生命周期:** Rust 的生命周期系统确保引用的有效性和安全性,防止了悬空引用和指针乱用。 + * ① `所有权和借用`: Rust 引入了所有权和借用的概念,编译器在编译时静态分析所有权转移和引用的生命周期。这种机制避免了数据竞争和空指针解引用等运行时错误,使得在编译时就能够保证内存安全。 + * ② `生命周期`: Rust 的生命周期系统确保引用的有效性和安全性,防止了悬空引用和指针乱用。 * `Java`采用了如下的策略和机制,来解决指针危险操作的: - * ① **引用类型和自动内存管理:** Java 中所有的对象引用都是通过引用来访问的,而不是直接的指针。Java 的自动垃圾回收器负责管理内存,从而避免了手动内存管理可能导致的指针错误,如:内存泄漏和悬空指针。 - * ② **强类型系统和异常处理:** Java 的强类型系统和异常处理机制减少了指针操作带来的风险,如:空指针解引用异常(NullPointerException)。编译器在编译时能够捕获许多潜在的类型错误,进一步增强了程序的安全性和可靠性。 + * ① `引用类型和自动内存管理`: Java 中所有的对象引用都是通过引用来访问的,而不是直接的指针。Java 的自动垃圾回收器负责管理内存,从而避免了手动内存管理可能导致的指针错误,如:内存泄漏和悬空指针。 + * ② `强类型系统和异常处理`: Java 的强类型系统和异常处理机制减少了指针操作带来的风险,如:空指针解引用异常(NullPointerException)。编译器在编译时能够捕获许多潜在的类型错误,进一步增强了程序的安全性和可靠性。 > [!IMPORTANT] >