人们总说时间会改变一些,但实际上这一切还得你自己来。

一.概念详解

  变量:计算机语言中储存计算结果,其值可以被修改。通过变量名来访问计算机中一段连续的内存空间。

  属性:区别于同类事物的特征。

  C语言中变量的属性关键字有:auto register static extern

二.属性关键字详解

  ①auto

    用于修饰局部变量的默认属性修饰关键字,表明将自动变量表明存储在栈中。

     @note:auto只能修饰局部变量,修饰全局变量会报错。

 #include <stdio.h>
auto int var=;  //err: auto不能修饰全局变量。
int main(){
printf("%d\n",var);
return ;
}

  ②register

    用于向编译器申请将局部变量放入寄存器区域,不一定请求成功。

 #include <stdio.h>
register int var=; //err:  register name not specified for 'var'
int main(){
register int i=;
printf("%d\n",&i); //err:address of register variable 'i' requested
printf("%d\n",var);
return ;
}

    @note:不能利用取地址运算符&,来获得寄存器变量的地址。

  ③static

    将变量存储到静态区域。

    修饰全局变量:将静态全局变量的作用域缩小到定义文件。

    修饰局部变量:将静态局部变量存储到静态区域,延长局部变量的生命周期。

    修饰函数:静态函数作用域只是声明的文件中。

 #include <stdio.h>
int f1(){
int i=;
i++;
return i;
}
int f2(){
static int i=;
i++;
//k++;      //err:'k' undeclared (first use in this function)
return i;
}
int main(){
int j=;
static int k;
for(j=;j<;j++)
printf("%d\n",f1());
for(j=;j<;j++)
printf("%d\n",f2());
return ;
}

    

  ④extern

   用于声明外部的变量或函数,告知编译器在其他文件中寻找该变量或函数定义。

     扩展:C与C++语言之间的桥梁,告知C/C++编译器以C语言编译方式编译。

  

 #include <stdio.h>
extern int i;  //
int main(){
printf("%d\n",i); //告诉编译器i在其他地方可以找到。
return ;
}
int i=;

三、extern和static的互斥关系

extern用于引用外部的,也即其他文件中的全局变量或函数。而static修饰的全局变量作用域被限定在本文件内,故而使用extern关键字引用其他文件的静态全局变量是不行的。

test1.c

 #include <stdio.h>
extern int i;
int main(void){
printf("%d\n",i);
return ;
}

test2.c

#include <stdio.h> static int i=;

报错err:undefined reference to `i'

extern可与static结合使用,屏蔽test2代码中的实现细节,只提供一个函数接口给其他人使用,可有效防止泄密。

使用示例:

 #include <stdio.h>
extern int getI();
extern int putI(int j);
int main(void){
int i;
i=getI();
printf("%d\n",i);
scanf("%d",&i);
putI(i);
i=getI();
printf("%d\n",i);
return ;
}
 #include <stdio.h>
static int i=;
int getI(){ return i;
}
int putI(int j){
i=j;
return ;
}

最新文章

  1. SOME:收缩数据库日志文件,查看表数据量和空间占用,查看表结构索引修改时间
  2. JavaScript实现存储HTML字符串
  3. Vmware为Ubuntu安装VmTools
  4. HTTP 错误 404.3 - Not Found由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射
  5. Source Insight 显示中文乱码
  6. 使用gradle构建java项目
  7. Sql排名和分组排名
  8. java和javax都是Java的API包,java是核心包,javax的x是extension的意思,也就是扩展包。
  9. echarts 折柱混合图 (绑数据后)
  10. 读取指定文件夹下的全部文件,可通过正则进行过滤,返回文件路径数组 -- 基于node的一个函数
  11. 【Redis使用系列】redis设置登陆密码
  12. spring boot - 整合jpa多对对关系保存和查询示例
  13. 配置sudo记录日志
  14. 检查SQL Server被哪个进程占用,且杀进程。
  15. leetcode 152. Maximum Product Subarry
  16. SQL SERVER 数据库面试题
  17. UTF-8和GBK编码的区别
  18. 项目托管到Github上
  19. python - 常用模块 os, sys
  20. Linux系统管理 常用命令

热门文章

  1. stand up meeting 1/8/2016 &amp; weekend 1/9/2016~1/10/2016 &amp;&amp; sprint2扫尾
  2. F. 蚂蚁装修
  3. F. Count Prime Pairs
  4. Catch him 杭电 2531
  5. CodeForces - 855B ring 前缀和
  6. python 基础篇 模块化
  7. python 工具链 多版本管理工具 pyenv
  8. Mysql基础练习--实例
  9. C/C++,被誉为“最经典的编程语言”,不仅是因为编程入门需要学?
  10. thinkphp if便签的使用