初探C的结构体

来源:互联网 发布:上海 逛街 知乎 编辑:程序博客网 时间:2024/05/17 18:19

上来先说点别的

编译过程:

(.c文件)-预处理(.i文件)-编译(.s文件)-汇编(.o文件)-链接(可执行文件)


预处理:

1.展开头文件

2.宏定义   宏替换只是替换,不会运算

 

宏不考虑c的语法,只是单纯的字符串替换

宏相对于调用函数来说,可以不考虑返回值的类型,因为宏可以不考虑c的语法


定义方法:

#define R 10      //不用分号 或者:   #define ADD(a,b) a+b

 

typedef: //给变量起别名,加分号结尾,预处理后不替换

typedef int tni;//给变量类型int起一个别名tni,要用分号结尾

typedef int*p;  //给int *起别名p;int *q =NULL;相当于 p q=NULL;

 

结构体:创建(声明) 定义 初始化 引用

struct xinx  //创建结构体类型struct xinx{    char name[20];    int sanwei;};struct xinx aver;    //定义一个变量cangls(这种是声明与定义分离形式)struct xinx aver={“cangls”,90 };//结构图初始化printf(“%s\n %d\n”,aver.name , aver.sanwei);  //引用结构体  . 是最高优先符struct xinx *w;      //定义指向结构体的指针w=&xinx;          //初始化指针printf(“%s\n”,(*w).name);    //引用  (*w)括号不能省,因为 . 比*优先//可以使用”w->name”代替(*w).name结构体指针:1 stu.成员名(stu.name)2(*p).成员名(  (*p).name  )3p->成员名(p->name)


 

 

共用体:

结构体占用空间的大小,其实是:最后一个变量的偏移量(某一个成员的实际地址与这个结构体首地址的距离)(还有偏移量必须是这个变量所占用内存的整数倍,如果不是编译器就会在成员之间加上前充字节),加上最后一个变量的内存大小,如果前两个加起来不能整除最宽的变量,那么还要加上最后一个变量的尾部填充字节数。所有成员共享一个内存地址


1.联合体 union的作用:让几个不同类型的变量共享同一个内存地址,同一时刻只能存储

 一个成员;初始化时只能有一个常量;内存长度取最长值;

2.结构体内存大小:以最后一个成员的偏移量+自身大小+字节填充

(电脑会自行填充至成员大小整数倍)