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] == ?

解答:

CS107 笔记(一)

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

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

struct pupils [4] 的结构如图:

CS107 笔记(一)

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

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

CS107 笔记(一)

 

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