变量的存储位置
1. 变量的作用域
变量的作用域 和其编译阶段有关,如果超出作用域,就会导致编译错误。即 -s 文件名时会出错。
基于全文件的作用域,这种全局变量需要用到多文件编译。(初学者不要定义这样的全局变量,会让代码变得非常复杂,Debug不好处理。)
基于本文件的作用域,这种一般称为静态全局变量,只和这个文件相关,其他文件无法使用。
函数内的局部变量,只能在本函数中使用,其他函数中无法使用。
基于域的局部变量,只能在域中使用,域外部无法使用。
变量的作用域范围为变量的定义或者扩展定义开始,直到域结束为止。
扩展作用域一般使用extern关键字在需要的位置进行拓展。如果使用extern对局部变量进行扩展作用域,将会导致链接的过程中找不到该变量 出现链接错误。
这是因为 extern只会扩充作用域,但是局部变量在对应的局部域中没有真正定义,从而出现找不到实体的链接错误。
extern只是声明不定义,不在内存中申请空间。
声明和定义的区别
声明,指定了一个变量的标识符,用于编译器识别变量名所引用的实体。定义是对声明的实现或实例化。链接器需要用定义来引用内存实体。
如果只是为了给编译器提供引用标识,让编译器能够知道有这个引用,能用这个引用来引用某个实体(但没有为实体分配具体内存块的过程)是为声明。如果该操作能够为引用指定一块特定的内存,使得该引用能够在link阶段唯一正确地对应一块内存,这样的操作是为定义。
声明是为了让编译器正确处理对声明变量和函数的引用。定义是一个给变量分配内存的过程,或者是说明一个函数具体干什么用。
2.变量的生命周期
变量的生命周期和程序运行阶段有关,如果超出生命周期,就会导致运行错误
对于非静态局部变量,我们一般称其定义的位置在栈区。栈区的特点是当对应的域结束时,系统会对这块空间进行释放。释放即允许其他程序或内容对他再次编写。
另外可以手动申请把变量存放到堆区,堆区需要手动进行释放。
可通过static关键字声明变量存放在静态区。静态区是和整个程序相关的,程序结束,它才会被释放。
全局变量,自带静态特性。
生命周期的开始为:变量的定义;结束为:变量的空间的释放。
static 针对生命周期,使其声明的变量存放到静态区。针对作用域,其表示限定作用域。比如在某些.c文件中定义的函数,添加static,限定该函数只能用于当前的.c文件。
形参是对应的局部作用域范围中最广的。同理for循环变量声明也是局部域当中范围最广的。
int main(int argc, char const *argv[]);
以上函数声明中的参数代表命令行中输入的命令参数。argc代表参数个数,argv[]代表参数值。
平时我们需要在linux系统下输入很多指令,比如
chmod +x var.c
其中chomd是主指令,后面跟着的两个是参数。可以通过我们自定义的可执行文件对它进行处理,是一种写自定义指令的方式。比如
man --help
它通过调用自己的可执行文件来完成对应的事。
参考https://jingyan.baidu.com/article/020278118e51e01bcd9ce576.html