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为例