int num = 3;
该声明创建了一个名为num的变量,变量值为3,num是这个变量的名字,也就是标识符。标识符是一个名称,一个合法的标识符必须以字母或者下划线(_)开头,其组成可以由字母,下划线和数字组成。
num变量是一个存储在内存中的变量。也就是说,num在内存中实际占用一定的物理内存,C语言把这样一块内存称为对象。
存储期:是指对象在内存中保留了多长时间。(即这块内存的可使用时长)。
标识符可以用来访问这样一个内存,可以用作用域、链接描述标识符,标识符的作用域和链接表明了程序的哪些部分可以使用它。
作用域用来描述程序中可以访问某个标识符的区域。
作用域的大小包括块作用域、函数作用域、函数原型作用域和文件作用域。
for (int i; i < 15; i ++){
int n = 10;
...;
...;
}
在for循环中,i的作用域就是块作用域,变量n的作用域也是块作用域,即在这个块中,i和n是可用的,在这个块外面,如果再存在i或n,则两者是不同的。while块、do while块、if和else语句块都是块作用域。
函数作用域仅用于goto语句。
函数原型作用域的范围是从形参定义处到原型声明结束。
int add(int a, int b);
这就是一个函数声明。
文件作用域,变量定义在文件开头(也不一定非得在开头,不过一般都写在开头)并在所有函数的外面。
#include
int count = 0;
int main(void){
...;
}
这里面的count变量就是文件作用域变量,即count可以在所有函数中使用。文件作用域变量也成为全局变量。
局部变量: 块作用域的变量,函数原型作用域变量,函数作用域变量都是局部变量。这意味着,这些变量只能在指定区域使用。但是,如果全局变量与局部变量重名,且在该块中存在一个同名局部变量,块优先使用局部变量。
#include
using namespace std;
int count = 0;
int main(void){
count ++;
cout<< "count = " << count << endl;
example();
cout<< "count = " << count << endl;
return 0;
}
voud example(void){
int count = 15;
cout << "example count = " << count <
开头的count = 0,就是一个全局变量,example函数中count = 15,就是一个局部变量。
C变量具有3种链接属性:外部链接、内部链接和无链接。
== 具有块作用域、函数作用域、函数原型作用域的变量(局部变量)都是无链接变量。==
具有文件作用域(全局变量)可以是外部链接或内部链接。
存储期描述了通过这些标识符访问的对象的生命期。 C对象共有四种存储周期:静态存储期、线程存储期、自动存储期和动态分配存储期。
静态存储期的存储时间最长,如果某一个变量具有静态存储期,则它在程序的执行期间会一直存在。文件作用域的变量(全局变量)具有静态存储周期。
线程存储期、自动存储期、动态分配存储期一般都不具有全局的生命周期(除非使用static限定的变量),它们是随着线程、块、动态空间分配函数的分配作用域来决定的。
简单地来说就是使用static进行限定的变量和全局变量。静态的意思是,该变量一经声明定义(静态变量声明的同时必须进行定义)在内存中拥有一块存储区域后,就会一直在该块内存中,直到程序执行结束。其变量值可以改变,但是物理内存不会改变。
函数中声明定义的静态变量,具有静态存储周期,但是作用域仅是块作用域,不是全局作用域。(也就是说,函数执行结束后,该变量的内存不会被释放,但其他函数也无法使用该变量)