一、类型定义 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;
}
三、递归
递归的两个条件:
函数自己调用自己
必须有明确的返回值