This commit is contained in:
许大仙 2024-08-13 10:39:52 +08:00
parent cf51d006e4
commit fcbfbbca65
2 changed files with 30 additions and 26 deletions

View File

@ -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 ThompsonGo 诞生的背景据说是`肯·汤姆森`Ken Thompson在 C++ 委员会在为其演讲 C++ 新特性的时候,觉得 C++ 新特性太多太复杂,于是就开发了 Go 语言所以Go 语言中有很多 C 语言的身影。

View File

@ -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]
>