1.extern

extern用来声明变量或者函数的,extern声明不是定义,也不分配存储空间。

在一个文件中定义了变量和函数,想要在其他文件中使用它们,可以有两种方式:

  • 先声明它们,然后引用头文件,其他文件再去包含头文件;
  • 在其他文件中直接extern。

2.static

2.1static(修饰局部变量)

静态局部变量使用static修饰符定义static修饰局部变量可以把它初始化为0

且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。

2.2static(修饰全局变量)

静态全局变量仅当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,

两者互不影响定义在函数体外部,在全局数据区分配存储空间,编译器会自动对其初始化

2.3static(修饰函数量)

静态全局变量仅当前文件可见,其他文件不可访问,不同的文件可以使用相同名字的静态函数,互不影响

3.const常量和#define的区别

区别1:

执行程序:

define是在编译的预处理阶段起作用,而const是在编译、运行的时候起作用。

区别2:
对程序的作用:
define只是简单的字符串替换,没有类型检查。
而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误。

1
2
3
4
5
6
7
8
9
10
const int n = 10; 	const修饰变量n后,保护了变量n,使其不能被赋值修改。 const.c
const int *p = &n; n里面的值不能被改变//*p= 20; //会报错const1.c

const int*p= &n;n里面的值不能被改变//*p= 20;1/会报错const1.c
const放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。
const修饰过的指针变量p不能修改a中的内容,而没有用const修饰过的指针变量q照样可以修改a中的内容,而且a自己也可以重新给自己赋值。

const放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改。
int *const p = &n; 指向n的行为不能被改变 //p = &m; //会报错
int const *p????????????????

4.typedef

第一种理解:将变量重新定义新名字

系统默认的所有基本类型都可以利用typedef 关键字来重新定义类型名

第二种理解:将结构体重新定义新名字

1
2
3
4
5
6
7
8
9
10
11
用以下结构体为例,定义一个名为student的结构体:
struct student{
age x;
number y;
};
调用这个结构体时,以须这样来调用这个结构体
struct student ming={20100}; // struct student hong;

起个别名
typedef struct student name;
name ming={20100}; // name hong;程序验证