最近一年都在用.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及源码:点击

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

麻省理工《C内存管理和C++面向对象编程》笔记---第一讲:认识C和内存管理的更多相关文章

  1. (麻省理工免费课程)C语言内存管理和C++面向对象编程

    此课程有全部讲义和习题. 课程描述实在得令人发指.翻译如下: 您是否由于自己的Python程序比同僚们的C程序慢而垂头丧气?你是否想不用JAVA实现面向对象?加入我们,学习C和C++吧!我们带您从简单 ...

  2. 面向对象编程(十)——继承之Super关键字及内存分析

    Super关键字

  3. 学习面向对象编程OOP 第一天

    面向对象编程 Object Oriented Programming 一.什么是面向对象编程OOP 1.计算机编程架构; 2.计算机程序是由一个能够起到子程序作用的单元或者对象组合而成.也就是说由多个 ...

  4. javascript面向对象编程笔记(基本数据类型,数组,循环及条件表达式)

    javascript面向对象编程指南 最近在看这本书,以下是我的笔记,仅供参考. 第二章 基本数据类型.数组.循环及条件表达式 2.1 变量 区分大小写 2.3 基本数据类型 数字:包括浮点数与整数 ...

  5. javascript面向对象编程笔记

    对象:一切事物皆是对象.对象是一个整体,对外提供一些操作.比如说一个收音机是一个对象,我们不需要知道它的内部结构是什么,只需要会使用外部的按钮就可以使用收音机. 面向对象:面向对象语言的标志是他们都有 ...

  6. PHP 面向对象编程笔记 (麦子 php 第二阶段)

    类是把具有相似特性的对象归纳到一个类中,类就是一组相同属性和行为的对象的集合.类和对象的关系:类是相似对象的描述,先有类,再有对象.类是对象的抽象,对象是类的实例.通过class关键字创建类,成员属性 ...

  7. PC逆向之代码还原技术,第一讲基本数据类型在内存中的表现形式.浮点,指针寻址公式

    目录 代码还原技术 一丶简介代码还原 二丶代码还原中的数据类型表现形式 1.整数类型 2.无符号整数 3.有符号整数 4.浮点数数据类型 5.浮点编码 4.Double类型解析. 三丶浮点汇编 1.浮 ...

  8. 面向对象编程笔记--static

    通过static方法,提供静态的不需要实例化即可访问的方法或属性.所有的调用者可以使用同一个类(不实例化)或对象(只实例化一次),可以应用的场景: 1)各个调用者共享数据,协同工作. 2)对象只可以实 ...

  9. javascript面向对象编程笔记(函数之闭包)

    3 函数 3.5 闭包(closures) 3.5.1 作用域链 与很多程序设计语言不同,javascript不存在大括号级的作用域,但它有函数作用域,即在函数内定义的变量在函数外是不可见的.但如果该 ...

随机推荐

  1. 【BZOJ3488】[ONTAK2010]Highways 扫描线+树状数组

    [BZOJ3488][ONTAK2010]Highways Description 给一棵n个点的树以及m条额外的双向边q次询问,统计满足以下条件的u到v的路径:恰经过一条额外的边不经过树上u到v的路 ...

  2. 关于Future

    1 为什么需要Callable和Future Runnable没有返回值,也不抛异常,这样主线程不能知道子线程的执行结果. 为了解决这个问题就有了Callable和Future.Callable提供的 ...

  3. React-Native在gitHub下载的Demo不能运行问题!!!

    1.目前找到的最可行的运行React-Native Demo的解决方案 请参考:http://blog.csdn.net/shubinniu/article/details/52873250 2.检查 ...

  4. 给MDI窗体加背景,解释MakeObjectInstance和CallWindowProc的用法

    工程含有1个MDI主窗口和2个子窗口.唯一需要注意的是,每个窗体都有ClientHandle,但只有当自己是MDI主窗体的情况下才有值,否则等于0. unit Unit1; interface use ...

  5. Linux中的man

    1.查看命令的帮助信息 man mkdir 2.查看服务配置文件的帮助信息 man services 说明: a.如果没有man通过yum install man安装 b.如果命令和服务同名了,那就指 ...

  6. ACM-最小生成树之继续畅通project——hdu1879

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/lx417147512/article/details/27092583 ************** ...

  7. (转)ubuntu 12.04搭建Adobe Flash Media Server服务

    破解版传送门:http://fms45.cuplayer.com/fms4download.html 福利:1462-5247-1705-7678-8379-5590 下载解压 cd进目录,./ins ...

  8. Linux系统BTC挖矿傻瓜教程

    [Linux系统BTC/比特币矿池挖矿方案一]cgminer矿池挖矿程序(Linux系统 比特币(BTC) 矿池挖矿/采矿/造币)cgminer矿池挖矿程序[查看这里有没有最新版]http://ck. ...

  9. SpringBoot学习笔记(2):引入Spring Security

    SpringBoot学习笔记(2):用Spring Security来保护你的应用 快速开始 本指南将引导您完成使用受Spring Security保护的资源创建简单Web应用程序的过程. 参考资料: ...

  10. Kattis - friday 【数学】

    题意 每一年的第一天 都是星期天 然后 给出 一年的总天数 和 总月数 以及 每个月 的总天数 求出 有多少个星期五 是当月的13号 思路 对于 每个月 只要判断 当月的13号 是不是 星期五 就可以 ...