承接上次的没有复习完的知识点。
1.数组
1.1 二维数组
例题:int a[5][2] = {1, 2, 3, 4, 5, 6, 7};int (*p)[2] = a;**p的值为?
解:p是一个二维的指针数组,其第一个元素是1,3,5,7,0的地址,因此 **p = 1。
例题:int a[5][2] = {(1, 2), (3, 4), (5, 6), 7}的元素只有括号中后面的,称为逗号表达式。
解:意即int a[5][2] = {2, 4, 6, 7, 0}。
例题:int i = 1;int c = (++i, ++i),则c的值?
解:首先c是一个逗号表达式,但是逗号表达式也会执行逗号之前的 ++i 操作,因此c的值为3。
2.函数
2.1 函数名缩写规则:去掉第二个及以后的元音和不发音的字母。
2.2 参数:传入参数和传出参数。
参数是传入参数还是传出参数可以根据函数参数中的 In_ 还是 Out_ 进行区分。
2.3 函数指针
对于函数指针,首先其是一个指针变量,该指针指向一个函数;其次,函数指针有两个用途:调用函数和做函数的参数。
3.字符串
3.1 例题
例:char str1[] = “hello”;char *str2 = “hello”;str1 = “hi”;str2 = “hi”;其中,str2可以被修改成功,str1会报错:不是一个可修改的左值。
3.2 strcpy、strcat会在结尾处加 \0 ,strncpy与strncat则不会在结尾处加 \0。
3.3 strcmp(“hi”, “hi”)语句会出现死循环现象,原因:因为"hi"与"hi"在相同的存储位置,因此会一直进行比较大小,但是由于开始的位置一样,因此不会出现不一样的值,进而会导致死循环。strcmp的工作原理是寻找不同的值结束,而不是寻找 \0 结束的。
4.结构体
4.1 结构体占内存的大小,按最大基本类型进行补齐。
4.2 相同结构体在不同的操作系统中的大小不同的原因:
1.对齐方式不同;
2.相同类型在不同位数操作系统中所占的大小不同。
4.3 结构体为什么要进行对齐?
为了方便在结构体中查找某一成员。
4.4 强制不对齐的方法:在开头加上 #pragma pack 1 语句,意为强制按1的倍数进行对齐。
5.数据结构
5.1 集合,线性表
5.2 线性表有两种存储方式:顺序存储和链式存储。
5.3 例题
例:一个数组有n个元素,值为0~n-1,若有重复的值则直接报错,请实现程序。
解:用第零个元素的下标与其值进行比较,不相同则将此元素交换到该元素所对应的下标处,在进行迭代;方法2:bit_map
5.4 链式存储
请完成一个单链表。