复杂类型及编译相关
Posted smallqizhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了复杂类型及编译相关相关的知识,希望对你有一定的参考价值。
1.自定义类型
typedef:
语法格式:typedef 声明语句;//声明语句里面的变量就是它那种变量类型的别名。
typedef 与 #define的区别:
1)语法格式不同。
2)#define是一个纯粹的替换,typedef是一个自定义类型,并不是替换。
3)命名上,#define一般使用大写字符去代表,typedef一般使用小写字符_t去结尾。
4)typedef能够定义复杂类型,宏定义则不行。
2.结构体:将多种数据类型合并成为一种复合类型,以后用这种类型声明一个变量,那么这个变量就会拥有多个对应的数据类型数据。
1)格式:struct student{
int num;
char name[20];
...
};
2)结构体的声明方式
a.跟普通变量的声明一样
struct student{
char name[20];
int num;
};
struct student st;
b.在声明的时候可以同时诞生一个变量出来(常用)
struct student{
int num;
char name[20]‘
}st;
c.多重结构体,里面的结构体就是匿名结构体
struct student{
int num;
char name[20];
struct{
int a;
char b;
}tt;
}
3)结构体变量的操作方式
a.通过结构体名字直接访问内部的元素
格式:结构体变量名.元素名,例如:st.name
b.通过结构体的地址访问元素
struct student *sp;//定义一个结构体指针
sp->num = 100;等价于(*sp).num;
c.剩余的操作跟其他类型一样
4)结构体的初始化
a.类似于数组的赋值方式,将多个数据直接用{}包起来,然后按顺序往里面填内容。
b.也可以值赋值其中的一个或者多个。
c.指定某个具体的元素名字进行赋值,后面如果没有指定名字,则按照名字后的顺序赋值(可以若干个,可以乱序)。
5)结构体的赋值
跟普通变量一样,直接赋值。
6)结构体的大小
结构体在创建的时候,内存对齐。
计算方法:先找出里面元素最大的大小是多少(32位系统的封顶值是4个字节,64位是8个字节)
a.按照顺序来分内存。
b.按照元素最大大小来进行内存对齐申请。
c.如果剩下的空间不够放下一个元素,那么将会开辟一片新的空间,直接跳过这个不够用的空间。
d.最后结尾如果还有空的内存,也会并入结构体内存中。
3.共用体/联合体 union
共用体所有的语法跟结构体一样,例子:
union test{
int a;
char b;
}
在函数调用,共用体传入参数的时候,不用选择传入地址类型。
共用体被用来解决的问题:一种类型,多种用法。
4.枚举常量
特点:将多种相同类型的数据统一的取别名。
格式:enmu 枚举名字{
枚举成员1,枚举成员2...}
a.在C语言中,枚举类型比较少用到,已经优化成不需要写枚举名字了。
b.枚举里面的成员的名字以后就是个整型常量。
c.枚举成员如果没有初始化则按照每个成员值+1的形式赋值,第一个没有初始化则从0开始。
d.枚举成员是一个常量,所以不能给他赋值。
e.switch语句中可以使用枚举常量,case xxx。
5.#define 宏定义(一种纯粹的替换)
格式:#define 名字 内容
宏函数:#define 函数名(参数列表) ({ 内容; })
注意:
a.宏函数的参数列表没有数据类型.
b.只是个纯粹的替换.
c.宏函数的返回值就是最后一条表达式的值。
d.不会开辟新的栈,是指纯粹的替换而已。
缺点:
a.宏函数如果一不小心破坏了程序的逻辑,很难找到错误的原因,兼容性差,因此一般不会轻易定义宏函数。
6.预处理语句
a.以#开头的语句
b.在gcc编译的第一步就被展开了(被去掉了),不会影响程序的速度。
注意:
a.预处理语出只能是一行,不能是多行。
b.名字一般都是大写的。
c.如果内容实在太多,我们可以用 来将下一行的内容跟上一行的内容合并。
7.头文件:将对各声明语句放在一起的特殊文件,以.h结尾。
头文件的内容:
a.预处理语句
b.声明语句 函数声明,类型声明
头文件的导入方式:
#include <头文件.h> 在系统环境中寻找,这种事添加系统自带的头文件
#include "头文件.h> 现在本地寻找要添加的头文件,如果没有才去系统中找。
头文件标准书写方式:
#ifndef 当前头文件的宏 #ifndef _FUNC_HEAD_H
#define 当前头文件的宏 #define _FUNC_HEAD_H
头文件的内容
#endif
8.条件编译语句(常用):选择对应的代码保留下来,剩下的就相当于注释掉。
#if 1(这里是1的话就执行a语句,是0就执行b语句)
a;
#else
b;
#endif
#iindef
#else
#endif
以上是关于复杂类型及编译相关的主要内容,如果未能解决你的问题,请参考以下文章
AndroidiOS ijkplayer编译步骤及相关问题解决
AndroidiOS ijkplayer编译步骤及相关问题解决