【C语言学习笔记】关键字:typedef、static和extern


第一部分 typedef
一、typedef的作用
给已经存在的数据类型起一个新的名字。
typedef 原有类型名 新名字;
二、使用场合
1、基本数据类型
typedef int MyInt;
// 在别名的基础上还能继续起别名
typedef MyInt MyInt2;
2、指针
typedef char * String;

//可以用String代替char *定义指针了
String name = "jake";
3、结构体
struct Student
{
    int age;
};

//给结构体类型Student起了个新名字Mystu
typedef struct Student Mystu;

//定义结构体变量并初始化
Mystu stu = {20};
//定义结构体类型,并且起个新名字
typedef struct Student
{
    int age;
} Mystu;
//还可以把结构体类型名省略掉
typedef struct
{
    int age;
} Mystu;
注意:省略了结构体类型名称之后,就不能使用原来的名字定义结构体变量了,而没有省略结构体名称的还可以使用struct Student stu2;定义新变量。
4、指向结构体的指针
// 定义结构体类型,并起个新名字
typedef struct Person
{
    int age;
} Per;

//给结构体指针起别名
typedef Per * PersonPoint;

//定义结构体变量
per jack = {25};

//定义指向结构体的指针
PersonPoint p = &jack;
//也可以直接用PersonPoint代替了结构体指针,类似上面指针的使用方法
typedef struct Person
{
    int age;
} * PersonPoint;
5、枚举
//定义枚举类型
enum Sex {Man, Woman};
//给枚举类型起新名字
typedef enum Sex Mysex;
//可以合并成
typedef enum Sex {
    Man,
    Woman
} Mysex;
//定义枚举变量
Mysex s = Man;
6、指向函数的指针
int sum(int a, int b)
{
    return a + b;
}

int minus(int a, int b)
{
    return a - b;
}

//给指向函数的指针类型,起了个别名叫MyPoint,被指向的函数接收2个int类型的参数,返回值为int类型。
typedef int (*MyPoint)(int, int);

//用别名定义了一个指向函数sum的指针变量p,函数名就是函数的地址
MyPoint p = sum;
//用别名定义了一个指向函数minus的指针变量p2
MyPoint p2 = minus;

//利用指针变量调用函数
(*p)(10, 9);
(*p2)(10, 9);
7、typedef与#define使用的区别
typedef char * String;

String s1, s2;
//等价于
String s1;
String s2;
//所以两个都是指针类型
char *s1;
char *s2;
#define String2 char *

String2 s3, s4;
//预处理时完成代替
char * s3, s4;
//等价于
char * s3;
char s4;
s4是char类型,s1、s2、s3是指针类型,所以,以后给类型起别名,最好使用typedef,而不是使用#define。


第二部分 static和extern

一、static和extern对函数的作用
1、extern对函数的作用:
1> 完整的定义一个外部函数
2> 完整的声明一个外部函数
外部函数特点:定义的函数能被本文件和其他文件访问,默认情况下所有函数都是外部函数,不允许有同名的外部函数。
2、static对函数的作用:
1> 定义一个内部函数
2> 声明一个内部函数
内部函数特点:定义的函数只能被本文件访问,其他文件不能访问,允许不同文件中有同名的内部函数。
二、static和extern对全局变量的作用
1、 extern对全局变量的作用:
声明一个外部变量
特点:定义的变量能被本文件和其他文件访问。默认情况下,所有的全局变量都是外部变量,不同文件中的同名外部变量,都代表着同一个变量。
2、static对全局变量的作用:
定义一个内部变量
特点:定义的变量只能被本文件访问,不能被其他文件访问。不同文件中的同名内部变量,互不影响。
三、static修饰局部变量:
1、延长局部变量的生命周期:程序结束的时候,局部变量才会被销毁
2、并没有改变局部变量的作用域
3、static修饰局部变量的使用场合:
void test()
{
    static double pi = 3.14;
    double zc = 2 * pi * 10;

    printf("zc = %f\n", zc);
}

int main()
{
    for (int i = 0; i<50; i++)
   {
        test();
    }
    return 0;
}
(1)如果某个函数的调用频率特别高
(2)这个函数内部的某个变量值是固定不变的



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值