C语言里的作用域,生命周期和static与extern关键字

作用域:

用通俗易懂的语言来说就是:一个代码中的名字使用是有限定范围的,举个例子:

C语言里的作用域,生命周期和static与extern关键字_第1张图片

 

i是在循环里面定义的,所以他的作用域就是for循环里面,因此,printf作为循环外的操作,这个i是没办法识别的。

 

生命周期:

生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。

1.局部变量的生命周期是:从进入作用域开始,直到作用于生命周期结束。

2.全局变量的生命周期是整个程序的生命周期。

注意:在主函数里面定义的也算局部变量,只有在所有函数之外定义的变量才叫全局变量。

 

static修饰局部变量:

来比较两组代码的区别以及他的输出结果

C语言里的作用域,生命周期和static与extern关键字_第2张图片

C语言里的作用域,生命周期和static与extern关键字_第3张图片 

第一组很正常,所以输出结果就是五个1

第二组s变量被static修饰,输出结果就变成了12345

 

所以可以猜测到,static没有销毁这个局部变量s,使得s再下一次循环中直接使用,而不是重新创建。

结论:static修饰的变量改变了变量的生命周期,生命周期改变的本质是改变了变量的存储类型,本来一个局部变量是储存在内存的栈区的,但是被static修饰后储存到了静态区,存储在静态区的变量与全局变量是一样的,所以其生命周期就和程序的生命周期一样了。但是这个变量的作用域不变。

除此之外要注意:

static修饰全局变量:

1.首先要知道全局变量是具有外部链接属性的

2.全局变量或者函数被static修饰后,外部链接属性就变成了内部链接属性,不能再跨文件使用了,相当于作用域变小了。

 

 

extern:声明外部符号

比如说有些其他文件里面定义了一个全局变量,那你放在另一个文件里面你需要声明一下这个外部符号。

同样的,引用其他文件的自定义函数也是需要申明的,用extern,不过不写在某些编译器里面也不受影响。

 

 

 

 

你可能感兴趣的:(c语言)