今晚看完这一章啦!为加入工作室奋战!!!=( ̄ˇ ̄)v
C为变量提供了五种存储模型/存储类,对于一个变量,可以按照存储时期、作用域以及链接来描述它。
一、( σ‘ω‘)σ关于作用域、链接、存储时期:
- 作用域(scope):分为①代码块作用域(block scope)②函数原型作用域 (function prototype scope)③文件作用域(file scope):指在所有函数之外定义的变量④*函数作用域(function scope):只适用于goto语句,暂不涉及。
- 链接(linkage):分为①外部链接(external linkage)②内部链接(internal linkage)③空链接(no linkage)
- 存储时期(storage duration):即变量在内存中保留的时间。分为①静态存储时期(static storage duration):该类变量在程序执行期间一直存在。②自动存储时期(automatic storage duration):为变量分配临时内存,完成其所在代码快操作后内存将被释放用于其他用途。
二、于是接下来就可以说明下这五种存储类啦o(* ̄▽ ̄*)ブ:
- 自动变量:具有自动存储时期、代码块作用域、空链接(其实我不太理解空链接什么意思(=。=)。。。),其存储类说明符:auto
Q: 如果在代码块内和代码块外使用同一变量名会怎样?
于是写段小程序。。。
1 #include<stdio.h> 2 int main() 3 { 4 int i=100; 5 { 6 int i=10; 7 printf("inner i=%d\n",i); 8 } 9 printf("outer i=%d\n",i); 10 return 0; 11 }
结果:
综上说明,这种情况下内层定义会覆盖(hide)外层定义当程序运行离开内层代码块,外部变量又会重新恢复作用
- 寄存器变量:寄存器变量会被存储在可以比普通内存更快访问和操作的地方(如果register请求在计算机的权衡下被允许,则可存储于CPU寄存器中,除此,会以自动变量类型存储在较快内存中)。它在很多方面跟自动变量是一样的(同样是自动存储时期、代码块作用域、空链接),但它是存放在寄存器中而非内存中,所以无法获得其地址。其存储类说明符:register(*注意:即使是auto但名义上仍是register,无法使用地址运算符)
- 具有代码块作用域得静态变量:具有静态存储时期、文件作用域、外部链接的变量。静态变量(static variable)所谓的“静态”,是指变量所在位置不变,存储类说明符:static
关于static的用处(> v <):
1 #include<stdio.h> 2 void exe(); 3 int main() 4 { 5 int i; 6 for(i=0;i<10;i++) 7 exe(); 8 return 0; 9 } 10 11 void exe() 12 { 13 int fade=0; 14 static int stay=0; 15 printf("fade=%d,stay=%d\n",fade++,stay++); 16 17 }
结果是酱紫的:
╰( ̄ω ̄o) 由上图可见,每次调用函数,fade不会记得上次自己的数值,因此每次从初始化时的数值开始;而static类型的stay则记得每次调用后的数值,并每次从记忆数值开始操作,即完成了代码块内的“静态”。
<(* ̄ー ̄)ゞps:对于函数参量是不可以使用static的,如下就不允许:
int hahaha(static int aho);//不允许哟!
- 具有外部链接的静态变量:即将定义声明放在所有函数之外的变量,具有文件作用域、外部链接、静态存储时期。这一类型被称作外部存储类(external storage class)(( ̄▽ ̄")传说中的“类”?),该类变量被称为外部变量(external variable)。在使用外部变量的函数中使用关键字:extern来再次声明它。
*( ̄_ ̄|||)其实看到这里并没看懂,关于具体怎么用extern。。。试试看吧。。。
写了段小代码以及N次小变动:
在函数中输出外部变量yui的值:
①在声明外部变量时赋初值:
1 #include<stdio.h> 2 int yui; 3 void exe(); 4 int main() 5 { 6 exe(); 7 return 0; 8 } 9 10 void exe() 11 { 12 extern int yui; 13 yui=233; 14 printf("yui=%d\n",yui); 15 16 }
成功输出"yui=233"。
①*对函数的小变动:
1 void exe() 2 { 3 extern int yui=233; 4 printf("yui=%d\n",yui); 5 }
然后就没有然后了。。。错误提示:变量不能同时是extern&&initializer。。。
②在声明yui同时赋值,在函数的int前不加extern:
1 #include<stdio.h> 2 int yui=233; 3 void exe(); 4 int main() 5 { 6 exe(); 7 return 0; 8 } 9 10 void exe() 11 { 12 int yui; 13 printf("yui=%d\n",yui); 14 }
结果:
如果不给yui赋初值,结果也是这个。此处函数中的yui为一个独立的局部变量,暂时性hide了外部变量。
③直接在函数中输出yui:
1 void exe() 2 { 3 printf("yui=%d\n",yui); 4 }
输出"yui=233",说明外部变量对整个文件各代码块都是可识别的。
④如果在整个程序中间某处声明外部变量,该外部变量对其之前函数不可见,对其之后函数则可见。
⑤变量定义与变量声明,如图:
1 #include<stdio.h> 2 int yui=233;//变量定义,必须有 3 void exe(); 4 int main() 5 { 6 extern int yui;//变量声明,可读性高,不影响程序,可以没有。这里的声明称“引用声明(referencing declaration)” 7 exe(); 8 return 0; 9 }
Σ(  ̄д ̄;)四点了,果然又。。。没看完,算了已经习惯了QAQ明天继续。。。