一.typedef的应用
1.给已定的变量类型起个别名
加不加typedef,类型不变
(加之前是个数组,加之后是数组类型;
加之前是个函数指针,加之后是函数指针类型;)
struct _person
{char name[20];int age;
};
typedef _person person_t;上下相等typedef struct _person
{char name[20];int age;
}person_t;
//怎么做的效果很是明显
struct Student
{char name[20];int age;char sex;
};int main(void)
{struct Student stu1 = { "qwl" , 20, 'm' };struct Student stu2 = { "qwj" , 16, 'm' };struct Student stu3 = { "chx" , 48, 'm' };struct Student* pst1 = &stu1;struct Student* pst2 = &stu2;struct Student* pst3 = &stu3;return 0;
}typedef struct Student
{char name[20];int age;char sex;
}STU;int main(void)
{STU stu1 = { "qwl" , 20, 'm' };STU stu2 = { "qwj" , 16, 'm' };STU stu3 = { "chx" , 48, 'm' };STU * pst1 = &stu1;STU * pst2 = &stu2;STU * pst3 = &stu3;return 0;
}
二.#define
标识符替换
#定义 标识符 内容
#define name stuff#define MAX 100
#定义 宏名(参数表) 内容
#define name(part-list) stuff#define ADD(a,b) (a)+(b)
part-list是一个由逗号隔开的标识符
三.assert
3.1 所在头文件 <assert.h>
3.2 assert()对表达式进行检测
如果expression的结果为 0(条件不成立),那么断言失败,表明程序出错,assert() 会向标准输出设备(一般是显示器)打印一条错误信息,并调用 abort() 函数终止程序的执行。
如果expression的结果为非 0(条件成立),那么断言成功,表明程序正确,assert() 不进行任何操作。
3.3 如果定义了#define NDEBUG,assert()就无效了
每次断言只能检验一个表达式
四.exit()函数
4.1 头文件<stdlib.h>
4.2 功能:
退出程序的函数
4.3 用法:
exit(1); 为异常退出(只要括号里的参数不是0都为异常退出)
exit(0);正常退出
4.4 与return();的区别
return()是返回上一级主调函数,不一定会退出程序
五.free函数
5.1 头文件<stdlib.h>
5.2free函数必须和malloc函数同时使用,否则会报错
free无法释放栈内存的变量
#include<stdio.h>
#include<stdlib.h>
struct node //定义结构体
{int name;//结构体里面定义一个变量叫做name
};int main()
{struct node *p;//定义一个结构体变量free(p);
}
这个代码会报错,因为free只能释放由malloc动态分配在堆内存的内存,直接在主函数定义结构体变量是分配在栈内存里的内存,所以释放不了
#include<stdio.h>
#include<stdlib.h>
struct node //定义结构体
{int name;//结构体里面定义一个变量叫做name
};int main()
{struct node *p = malloc(sizeof(struct node));//定义一个结构体变量free(p);
}
5.3 free函数释放的是指针所指向的地址的内存(不是指针本身所在地址的内存),因此可以通过函数直接释放内存
#include<stdio.h>
#include<stdlib.h>
struct node //定义结构体
{int name;//结构体里面定义一个变量叫做name
};void fun(struct node *p)
{free(p);
}int main()
{struct node *p = malloc(sizeof(struct node));//定义一个结构体变量p->name = 10;//给结构体赋值printf("%d\n",p->name);fun(p);//释放内存printf("%d",p->name);
}