麻省理工《C内存管理和C++面向对象编程》笔记---第一讲:认识C和内存管理

简介: 最近一年都在用.net和Java,现在需要用C了。昨天看到博客园首页的麻省理工开放课程,就找来看看,正好复习一下。这门《C内存管理和C++面向对象编程》不是那种上来就变量,循环的千篇一律的讲法,而是重点讲C的核心机制如内存管理、指针等,这对于我这种有一定编程基础,但很久没用C的人比较适合。

最近一年都在用.net和Java,现在需要用C了。昨天看到博客园首页的麻省理工开放课程,就找来看看,正好复习一下。这门《C内存管理和C++面向对象编程》不是那种上来就变量,循环的千篇一律的讲法,而是重点讲C的核心机制如内存管理、指针等,这对于我这种有一定编程基础,但很久没用C的人比较适合。简明的plain English,加上生动有趣的描述,看起来即畅快,又令人深受启发。不得不感慨MIT的水平。下面是我整理的笔记(部分翻译自课件,部分自己的总结):

  原版课件见课程官方主页点击

  课程中推荐的C/C++在线学习资料:http://www.cprogramming.com (个人觉得好的英文资料,读得时候虽然时不时要查查字典,但是比很多中文的都更容易理解,毕竟国外牛人多)

1. C语言家族

 1) C: Dennis Ritchie于1972年在贝尔实验室开发出来;是一种命令式语言(imperative system language)

 2) C++: Bjarne Stroustrup于1979年在贝尔实验室开发出来;是一种支持泛型(generics)的命令式,面向对象的语言

 3)C#: 2001年,由微软开发。是一种多范型(multi-paradigm)编程语言,支持命令式、函数、泛型、面向对象和内存管理。

 注:命令式语言又称强制式语言,通过指明一系列可执行的运算及运算的次序来描述计算过程的语言。平时我们用的大多数语言(比如,C,C+,Java,C#,Python等)都是命令式语言。与它相对的是函数式语言(functional language),如Haskell,Lisp。函数式语言更像数学,命令式语言更接近人的思维。

 

2. C的典型特征:

 1)编译型语言(compiled language)(相对于解释型语言来说)

   编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言的文件,运行时不需要重新翻译,直接运行编译的结果就行了。因此效率高

   解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译一次。因此效率比较低

 2)命令式的

 3) 人工管理内存

 4)当需要涉及以下问题时使用C:

   -速度

   -内存

   -低层次特性(low-level features),如:移动stack pointer等

 

3. 内存抽象的层次(从内存的角度思考C...) 
 

  抽象层次                        编程语言

  -------------------------------------- 

  直接操作内存                     汇编语言

  访问内存                         C,C++

  内存自动管理                     Java,C#,Scheme/LISP,ML

 

4. C访问的内存:堆(heap)

   堆是一块儿用于动态内存分配的内存区域

   1)把它想像称为一个巨大的数组

   2)通过指针(pointer)来访问

   3)整个程序都能访问堆(如果操作系统允许的话) 

 

5. 人工内存管理

  目的:

  1) 允许程序能够分配内存用于当前的使用

  2)当程序执行完后,能够释放内存,用于重新分配

  C语言的标准类库(standard library)中有malloc和free两个函数支持内存管理

 

6. 其它C访问的内存:棧(stack)

  C语言中棧是编译器自动分配和回收,用于存放函数及其参数,局部变量等的内存区域 

  C函数将会分配到棧中:

  1)函数在被调用时进棧(pushed on to stack)

  2) 函数在返回时出棧(popefd off the stack)

  3) 函数能访问当前棧顶部以下的所有内存(这里所谓的“顶部以下”如下图所示)

       

 7.一些基本的C语法如变量,循环,分支等跳过。

 

 8. 编译器。推荐使用GCC,一般是在linux下用gcc+gedit写C程序。

 

 9. 调试工具:gdb和valgrind。

    gdb文档: http://www.gnu.org/software/gdb/

    valgrind文档:http://valgrind.org/

 10. 课后作业1及源码:点击

    课件主要是提供思路和引导,课后作业才是锻炼的最好途径。 

目录
相关文章
|
7月前
|
存储 程序员 Linux
1024程序员节特辑 | C++入门指南:内存管理(建议收藏!!)
1024程序员节特辑 | C++入门指南:内存管理(建议收藏!!)
60 0
|
4月前
|
Web App开发 JavaScript 前端开发
浅入 V8 内存管理
【8月更文挑战第31天】浅入 V8 内存管理
42 0
|
7月前
|
存储 安全 程序员
C++语言中的内存管理技术
C++语言中的内存管理技术
|
存储 Linux C++
【C++杂货铺】内存管理(二)
【C++杂货铺】内存管理(二)
56 0
|
存储 C语言 C++
【C++杂货铺】内存管理(一)
【C++杂货铺】内存管理(一)
85 0
|
存储 Java 编译器
【C++从0到王者】第七站:内存管理(520没有对象?那就new一个)
【C++从0到王者】第七站:内存管理(520没有对象?那就new一个)
67 0
|
存储 编译器 Linux
内存管理基础概念总述
内存管理基础概念总述
96 0
|
算法
聊一聊内存管理(一)
聊一聊内存管理(一)
92 0
聊一聊内存管理(二)
聊一聊内存管理(二)
71 0
|
存储 程序员 C语言
C语言编程—内存管理
C语言中的动态内存管理。C语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。 在C语言中,内存是通过指针变量来管理的。指针是一个变量,它存储了一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整数、浮点数、字符和数组等。C语言提供了一些函数和运算符,使得程序员可以对内存进行操作,包括分配、释放、移动和复制等。 注意:void * 类型表示未确定类型的指针。C、C++ 规定 void * 类型可以通过类型转换强制转换为任何其它类型的指针。 动态分配内存 编程时,如果您预先知道数组的大小,那么定义数组时就比较容易。例如,一个存储人名的数组,它
118 0