CS107 笔记

lecture 2

各种类型数据对应的bite数

bool     1  ;     char     1  ;   short    2  ;   int    2 or 4  ;  long    4  ;   

float     4   ;    double  8 ;    指针    4(根据地址的bite数决定) ; 

 

lecture 3

1. 指针

指针的理解:
例子: 

double d = 0 ;
double *x = & d ; 

右边的 &d 确定了初始地址,还有指针的类型 double *,即直到初始地址 后8个bites的范围,存储 d。

因此左边边用 double* x 来存放。

此时 *x   表示从存放的地址起,取出8个bites范围内的数值,即的double d的值。

数组的理解:

int arr[5];

我们看 arr  其实是个 int* 类型的指针,arr[1] 等价与 *(arr + 1 )

加号左边是指针类型,右边数字表示指针地址增加n个int型的空间,再用* 取出存的数据,即arr[5].

因此个人理解这里的加号应该有运算符重构的思想,改变了加号右边数字的含义。

ok, 举个更难的例子

int arr[5];
( (short*)( (char*)(&arr[1]) + 8 ) )[3] == ?

解答:

再来个更难的,结构体的例子

struct{
char* name;
char suid[8];
int numUnits;
};

struct pupils [4] 的结构如图:

pupils[3].name = pupils[0].suid + 6;
strcpy(pupils[3].name , "123456");

执行后的结果为:(\0忘记写进去)

 

lecture 5

1. 一个c“模版”例子

void *lsearch(void *key, void *base, int n, int elemsize, int (*cmpfn)(void*, void*))

c语言制作的“模版”函数,线性查找,返回找到的东西的地址,cmpfn前面的*可以不用加,下面是它的使用

char *nodes[] = {"Ab", "F#", "B", "Gb", "b"} ;
char *key = "Gb";
char** found = lsearch(&key, nodes, 5, sizeof(char*), MyCmp);

第一个参数 key 是char**类型, 第二参数 nodes 是char**类型,下面制作MyCmp函数

int MyCmp(void *vp1, void *vp2)
{
    char *s1 = *(char**)vp1;
    char *s2 = *(char**)vp2;
    return strcmp(s1, s2);  //strcmp是比较字符串函数
}

char *s1 = *(char**)vp1; 的理解:

我们的cmp函数是“模版”函数,用void *vp1, void *vp2接收。用户 用 MyCmp(key, elemAddr)进行调用。

key和elemAddr是 char** 类型,因此先用(char**)vp1强制转换

*(char**)vp1 :vp1即key, *key 即 “Eb” 的指针

char *s1 = *(char**)vp1; //“Eb” 的指针是 char* 型的,所以用char *s1存放。

2. function 和 method

function就是普通函数,method是类里的方法

method的参量自带类的数据,即 this 指针。因此例如pop();可以这样直接这样写(隐含了this指针);

而普通函数需要这样写 : pop(stack* s) ; //以普通c为例

 

lecture 10

1. cpu结构

2. RAM

(即内存,与CPU通过BUS相连接)

从上到下:

静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存。

代码区:存放函数体的二进制代码。(机器码)

 

lecture 15

1. c编译过程

1) 预编译

将.c 文件转化成 .i文件(把头文件,宏都抄下来)

使用的gcc命令是:gcc –E

$ gcc -E hello.c -o hello.i

2) 编译

将.i 文件转换成.s文件(里面都是汇编语言)

使用的gcc命令是:gcc –S

$ gcc -s hello.i -o hello.s

3) 汇编

将.s 文件转化成 .o文件(里面都是机器码)

使用的gcc 命令是:gcc –c

$ gcc -c hello.s -o hello.o

4) 链接

将.o文件转化成可执行程序

使用的gcc 命令是: gcc

 $ gcc hello.o -o hello 

总结起来编译过程就上面的四个过程:预编译处理(.c) --> 编译、优化程序(.s、.asm)--> 汇编程序(.obj、.o、.a、.ko) --> 链接程序(.exe、.elf、.axf等)。

省略中间步骤:

$ gcc hello.c -o hello

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值