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