多文件方式

多文件的方式编写项目工程

vim以标签页的形式打开多个文件

编写makefile(Makefile)文件

写法二

写法三

写法一

C语言的作用域

全局变量和局部变量

全局变量

注意

区别

局部变量

在某个函数内部定义的或者在块内定义的变量叫做局部变量

局部变量只能在函数内或者块内使用

局部变量在函数外或者块外是不可见的

全局变量是定义在所有函数之外的,一般来说是定义在程序开头的位置(包含头文件之下的位置)

全局变量在整个程序中生命周期都是有效的

在任意函数中都可以使用全局变量

全局变量和局部变量可以同名,如果出现了同名的情况,那么在执行该函数的时候优先使用局部变量,因为在函数内局部变量可以把同名的全局变量屏蔽掉

定义时的区别

存储空间的区别

当定义局部变量时,系统不能帮助初始化,局部变量存储的是垃圾值

当定义全局变量时,系统会帮助初始化,全局变量存储的是0

局部变量 : 存储在栈区中,只有局部变量所在函数被调用的时候,系统才会给局部变量分配相应的存储单元

全局变量 : 存储在全局静态区,当程序运行时就被定义了,当程序结束的时候才会被释放

extern和static关键字

static

总结

extern

extern修改变量

extern修饰函数

证明其他文件也可以使用这个函数(可以省略不写extern)

如果自己写的函数只想在本文件内使用,不想被别的文件使用,需要使用static关键字修饰

证明该函数的实现在外部(在别的文件中)

在Linux系统中的gcc编译器环境下被extern关键字修饰的变量是不允许初始化的

如果在文件中的函数或者变量被extern关键字修饰了

当编译器编译时,如果碰到了extern关键字那么会从别的文件中找相关的定义

说明该函数或者该变量在别的文件中已经定义了,在当前文件中仅仅是一个引用

tatic是C语言关键字,是用来修饰静态的(内部的)

可以修饰函数,也可以修饰变量

注意 : 为了使全局变量可以安全的使用,请在定义全局变量的时候使用static关键字修饰

如果本文件内的函数或者变量想要让别的文件使用,可以加extern关键字修饰为外部

如果本文件内的函数或者变量不想让别的文件使用,可以加static关键字修饰为静态

容易混淆的声明

const关键字

指针常量和常量指针

const是C语言的关键字,是用来修饰只读的(read only)

const关键字修饰变量,变量名变为只读的,不能通过变量名修改变量的值

指针常量

常量指针

指针是常量

指针指向常量

可以通过指针常量修改指向空间的数据,但是不能通过指针名修改指针指向。

特性 : 可以通过指针改变指向,但是不同通过指针修改指向空间的数据。

指针函数和函数指针

指针数组和数组指针

命令行参数

数组指针

指针数组

指针函数:是一个函数,函数的返回值为指针的函数就是指针函数。

函数指针 :是一个指针,该指针指向特定类型的函数

就是一个数组,每个成员都是int *类型的指针,所以满足数组的所有特性。

int main(int argc, char *argv[ ])

argc 代表的是命令行参数的个数

argv 代表的是命令行参数的字符串

就是一个指针,该指针指向特定的数组。(也就是说数组指针是专门用来和数组产生关系的指针)。p是一个数组指针,该指针指向一行有5个成员,每个成员为int类型的数组

int *arr[5];

int (*p)[5];

函数指针数组: 是一个数组,数组中的每一个成员都是函数指针

注意 : 我们程序员在封装函数的时候不能返回局部栈区空间的地址。
因为当功能函数执行结束之后局部栈区空间被释放了

注意 : 函数名相当于是函数的入口地址(函数名就是一个地址)

char strcpy(char dest, const char *src);

int (*p)(int , int );

arr是一个数组,数组中有4个成员,每一个成员都是int(*)(int,int)的函数指针

int (*arr[4])(int, int);

typedef是C语言的关键字,可以定义数据类型或者给已有的数据类型起别名。

给已有的数据类型起别名

定义数据类型

typedef 已有的数据类型 别名;最有一定要有 ; 结尾