一、类型定义 typedef
1.作用:给已经存在的类型起一个新的名称
2.使用场合:
1>基本数据类型
2>指针
3>结构体
4>枚举
5>指向函数的指针
#include <stdio.h> #include <string.h> //基本数据类型 typedef int MyInt; //指针 typedef char * Point; typedef struct Person //Person 可以不写 { int age; } * MyPer; //结构体 typedef struct Student //Student 可以不写 { int age; } MyStu; //枚举 typedef enum Sex { man,women } MySex; //指向函数的指针 void test(int a,int b) { printf("sum---%d\n",a+b); } typedef void (* My) (int ,int);//My就是指针的新名称 int main() { //自定义的类型定义变量 MyInt a=90; printf("a=%d----size:%lu\n",a,sizeof a); //指针 Point s="fghjj"; printf("s=%s----size:%lu\n",s,strlen(s)); struct Person p={33}; MyPer per=&p; printf("age---%d\n",per->age); //结构体 MyStu stu={23}; printf("age---%d\n",stu.age); //枚举 MySex ms=man; printf("%d\n",ms); My my=test; (*my)(2,3); return 0; }typedef和#define
注意:除了预处理语句,其他都有;
#include <stdio.h> /* typedef int Myint0; #define Myint1 int 上面两句可以等价,用起来一样。但是本质上typedef定义的是类型,而define是文本替换 */ typedef char * String; #define String1 char * int main() { String s1,s2; String1 s3,s4; s1="qwe"; s2="sdf"; s3="ghh"; s4="ghkjn";//代码会崩溃 /* String 是个类型,定义的s1和s2都是指针 但是,String1是宏定义,只是文本替换 因此就变成 char *s3,s4 也就是char *s3; char s4; 所以s4不是指针,是char类型 */ return 0; }
二、static和extern
1.对函数的作用
函数分类:
外部函数:定义的函数能被本文件和其他文件访问,默认情况下所有函数都是外部函数
不允许有同名外部函数
内部函数:定义的函数只能被本文件访问,其他文件不能访问
允许不同文件中有相同的内部函数
static对函数的作用:
(1)定义一个内部函数
(2)声明一个内部函数
extern对函数的作用
(1)完整地定义一个外部函数 extern void test()
(2)完整地声明一个函数
extern可以省略,默认情况下声明和定义的函数都是外部函数
2、对全局变量变量的作用
全局变量分2种:
全局变量可以重复定义,但是局部变量不行。
外部变量:定义的变量能被本文件和其他文件访问。
默认情况下,所有的全局变量都是外部变量。
不同文件中的同名外部变量都代表同一个变量。
内部变量:定义的变量只能被本文件访问,其他文件不能访问。
不同文件中的同名变量互不影响。
static作用:定义一个内部变量
extern作用:声明一个外部变量(全局变量)
3、static对局部变量的作用(1)延长局部变量的生命周期。程序结束时,局部变量才会被销毁
(2)并没有改变局部变量的作用域
(3)程序没退出的情况下多次调用含该变量的函数,访问的都是这同一个值
static修饰局部变量的使用场合:
1>如果某个函数的调用频率特别高
2>这个函数内部某个变量值是固定不变的
#include <stdio.h> void test() { static int a=0; //用static修饰,意味着直到程序结束才会被销毁 a++; printf("a---%d\n",a); } int main() { test(); test(); test(); //变量a都是指的同一个 return 0; }
三、递归
递归的两个条件:
函数自己调用自己
必须有明确的返回值