什么是结构体
是一种数据类型
由程序员自定义的数据类型
结构体内可以包含不同类型的成员
结构体语法格式
struct 结构体名{
成员;
}
typedef struct{
int age; // 成员
char name[20];
}结构体名; // 别名
结构体所占内存空间
字符对齐规则
找出占存储空间最大的成员
以其为单位分配存储空间
每个成员存放在偏移量对该成员所占字节数取余为0处
结构体成员赋值
int main()
{
struct{
int i;
char ch;
double d;
}s;
s.i = 10;
s.ch = 'A';
s.d = 3.14;
printf("%d, %c, %g\n", s.i, s.ch, s.d);
return 0;
}
什么是联合
联合的用法、语法和结构非常相似,但联合中所有成员分配的内存是同一块。(只能保存一个成员信息,联合的空间以最大成员所占的空间为值)
联合可以用一块内存对应多种数据类型
联合与结构的区别,结构可以保存多个成员信息,而联合只能保存一个成员信息切最后一个。
联合语法格式
union 联合名{
int age;
char name[2];
}
typedef union{
int age;
char name[2];
}联合名;
什么是枚举
用字面来描述一组有规律的数值。
枚举的默认值从0开始,每个值都是一个整型常量。
只能在声明枚举的时候,修改枚举值。
枚举语法格式
enum 枚举名 {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};
typedef enum{FALSE, TRUE} 枚举名;
高级指针
双指针
什么是双指针(二级指针)
双指针即二级指针,是指针的指针
int main()
{
int x = 10;
int * px = &x;
int ** ppx = &px;
int *** pppx = &ppx;
int **** ppppx = &pppx;
return 0;
}
双指针的应用
void get_message(cbar ** p)
{
*p = "Hello World!";
}
int main()
{
char * msg = NULL;
get_message(&msg);
printf("msg:%s\n", msg);
return 0;
}
用参数返回字符串
定义一个函数,该函数的参数是一个指针的指针,用以返回函数体内的字符串。
void指针
什么是void的指针
代表任意类型的指针
malloc分配堆内存时,由于无法确定内存存储类型,所以可以谁用void*代表任意指针类型。
void指针的应用
不能直接对void*指针进行*操作,可以进行类型转换,然后在进行*操作。
void*能进行加减操作,但以1字节为单位进行运算,所以说想向void进行加、减操作,最好先别转换数据类型。
函数指针
什么是函数指针
函数指针是指向函数的指针变量
每个函数都有一个入口地址
指针变量中保存函数的入口地址
函数指针的用途(调用函数,做函数的参数)
函数指针的语法格式
void fa()
{
printf("in function fa\n");
}
int main()
{
printf("&fa = %p\n", &fa);
void(*pfa)(); // pfa是变量,函数指针变量,保存函数的地址
pfa = &fa;
(*pfa)();
return 0;
}
函数指针的应用
void fa()
{
printf(in function fa\n"");
}
void invoke(void(*f)())
{
printf("调用传进来的函数\n");
(*f)(); // 调用传入的函数
}
int main()
{
invoke(&fa);
return 0;
}
函数指针的优缺点
优点是对于通用函数中要涉用到另一个函数,但函数名称未定,是让用户编的,此时需要使用函数指针。
缺点是由于函数指针指向的函数未定,容易导致程序崩溃