多文件方式
多文件的方式编写项目工程
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 已有的数据类型 别名;最有一定要有 ; 结尾