C语言学习第十七弹

全局变量和局部变量
变量作用域基本概念
变量作用域:变量的可用范围
按照作用域的不同,变量可以分为:局部变量和全局变量
局部变量
定义在函数内部的变量以及函数的形参 , 我们称为局部变量
作用域:从定义的那一行开始 , 直到遇到 } 结束或者遇到 return 为止
生命周期 : 从程序运行到定义哪一行开始分配存储空间到程序离开该变量所在的作用域
存储位置 : 局部变量会存储在内存的栈区中
特点:
相同作用域内不可以定义同名变量
不同作用范围可以定义同名变量,内部作用域的变量会覆盖外部作用域的变量
全局变量
定义在函数外面的变量称为全局变量
作用域范围:从定义哪行开始直到文件结尾
生命周期 : 程序一启动就会分配存储空间 , 直到程序结束
存储位置:静态存储区
特点 : 多个同名的全局变量指向同一块存储空间
auto register 关键字
auto 关键字 ( 忘记 )
只能修饰局部变量 , 局部变量如果没有其它修饰符 , 默认就是 auto
特点 : 随用随开 , 用完即销
register 关键字 ( 忘记 )
只能修饰局部变量 , 原则上将内存中变量提升到 CPU 寄存器中存储 , 这样访问速度会更快
但是由于 CPU 寄存器数量相当有限 , 通常不同平台和编译器在优化阶段会自动转换为 auto
static 关键字
对局部变量的作用
延长局部变量的生命周期 , 从程序启动到程序退出 , 但是它并没有改变变量的作用域
enum Season {
Spring = 9 ,
Summer ,
Autumn ,
Winter
};
// 也就是说 spring 的值为 9 summer 的值为 10 autumn 的值为 11 winter 的值为 12
auto int num ; // 等价于 int num;
register int num ;
代码情缘 定义变量的代码在整个程序运行期间仅仅会执行一次
对全局变量的作用
全局变量分类:
内部变量 : 只能在本文件中访问的变量
外部变量 : 可以在其他文件中访问的变量 , 默认所有全局变量都是外部变量
默认情况下多个同名的全局变量共享一块空间 , 这样会导致全局变量污染问题
如果想让某个全局变量只在某个文件中使用 , 并且不和其他文件中同名全局变量共享同一块存储空
, 那么就可以使用 static
#include <stdio.h>
void test ();
int main ()
{
test ();
test ();
test ();
return 0 ;
}
void test (){
static int num = 0 ; // 局部变量
num ++ ;
// 如果不加 static 输出 1 1 1
// 如果添加 static 输出 1 2 3
printf ( "num = %i\n" , num );
}
// A 文件中的代码
int num ; // B 文件中的 num 共享
void test (){
printf ( "ds.c 中的 num = %i\n" , num );
}
// B 文件中的代码
#include <stdio.h>
#include "ds.h"
int num ; // A 文件中的 num 共享
int main ()
{
num = 666 ;
test (); // test 中输出 666
return 0 ;
}
// A 文件中的代码
static int num ; // 不和 B 文件中的 num 共享
void test (){
printf ( "ds.c 中的 num = %i\n" , num );
}
代码情缘 extern 关键字
对局部变量的作用
extern 不能用于局部变量
extern 代表声明一个变量 , 而不是定义一个变量 , 变量只有定义才会开辟存储空间
所以如果是局部变量 , 虽然提前声明有某个局部变量 , 但是局部变量只有执行到才会分配存储空间
对全局变量的作用
声明一个全局变量 , 代表告诉编译器我在其它地方定义了这个变量 , 你可以放心使用
static extern 对函数的作用
内部函数 : 只能在本文件中访问的函数
外部函数 : 可以在本文件中以及其他的文件中访问的函数
默认情况下所有的函数都是外部函数
static 作用
声明一个内部函数
// B 文件中的代码
#include <stdio.h>
#include "ds.h"
int num ; // 不和 A 文件中的 num 共享
int main ()
{
num = 666 ;
test (); // test 中输出 0
return 0 ;
}
#include <stdio.h>
int main ()
{
extern int num ;
num = 998 ; // 使用时并没有存储空间可用 , 所以声明了也没用
int num ; // 这里才会开辟
printf ( "num = %i\n" , num );
return 0 ;
}
#include <stdio.h>
int main ()
{
extern int num ; // 声明我们有名称叫做 num 变量
num = 998 ; // 使用时已经有对应的存储空间
printf ( "num = %i\n" , num );
return 0 ;
}
int num ; // 全局变量 , 程序启动就会分配存储空间
代码情缘 定义一个内部函数
extern 作用
声明一个外部函数
定义一个外部函数
注意点 :
由于默认情况下所有的函数都是外部函数 , 所以 extern 一般会省略
如果只有函数声明添加了 static extern, 而定义中没有添加 static extern, 那么无效
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值