再学C语言,复习&笔记。
系列顺序:
Linux C语言编程基本原理与实践
Linux C语言指针与内存
Linux C语言结构体
更多Linux知识:
一天一点linux
预处理
编译的四个步骤:.c文件—>.i文件(预处理)->.s文件(编译)->.o文件(汇编)->可执行文件(链接)
gcc -o helloWorld.i helloWorld.c -E
-E表示只让helloWorld.c进行预处理
结构体
结构体对象所占的空间大小涉及到一个字节对齐的问题。字节对齐的目的是让计算机快速读写,是一个以空间换取时间的方式。
结构体对象的大小 = 最后一个成员的偏移量 + 最后一个成员变量的大小 + 填充字节
结构体字节对齐准则:当前成员的偏移量必须是成员变量大小的整数倍,不是的话在后面填充字节。
最后还要判断结构体大小是不是成员中最大成员类型的整数倍,不是的话还需填充。
例:
1 | struct data{ |
a 4字节,b 1字节,c 4字节
计算方法:
- a的长度为4,为b的长度1的整数倍,故b的偏移量4字节。
- b的偏移量+b的长度=5字节,但5不能整除c的长度(4字节),故需填充偏移量到8字节。所以c的偏移量为8。
- c的偏移量+c的长度=8+4=12字节,且12字节是最大成员类型(4字节)的整数倍,故结构体所占空间为12字节。
注:C语言结构体和C++结构体定义的区别
- C结构体中只能自定义数据类型,不允许有函数。C++结构体可以加入成员函数,且允许该函数是虚函数。所以C结构体没有构造函数、析构函数和this指针。
- C结构体对内部成员变量的访问权限只能是public,C++结构体默认是public,可以是public,protected,private三种。
- C结构体不可继承,C结构体可以从其它结构体或类继承。
以上是表面区别,实际区别是面向过程和面向对象编程思路的区别:C的结构体只是把数据变量给包裹起来了,并不涉及算法。C是把数据变量及对这些数据变量的相关算法给封装起来,并且给对这些数据和类不同的访问权限。
C语言中没有类的概念,但可通过结构体内创建函数指针实现面向对象思想。 - 声明定义有区别:
1 | struct weapon |
C语言用struct weapon a;
C++可以直接 weapon a;
若C也希望直接声明,则需引入typedef,定义为:
1 | typedef struct weapon |
Wea a;
共用体
共用体的作用就使不同的类型的变量共享同一个地址,好处是节省开销,缺点是同一时刻仅仅能存储一个成员。
共用体的大小是所有成员中占内存最长的长度,初始化时只能有一个常量。
动态数据结构
静态链表
每一个结点都是在程序中定义的而不是临时开辟的。
1 |
|
动态链表
1 |
|
**注:**更多数据结构知识请参阅《数据结构(C语言版)》。
递归与递推
递归:将一个问题规模为n的问题降为规模为(n-1)的问题,然后依次降低规模(层层往下),直至问题得到低规模的解,之后依次带入高规模的问题中(层层往上),最终得到规模为n解。从n -> 1 -> n。
递推:先构造解决一个低的规模问题,然后依次(层层往上)推导出高规模的问题解。
从1 -> n。