C语言基础14 关键字

本文详细解读了C语言中的关键字'static',探讨其如何影响局部变量和全局变量的生命周期,以及在函数声明和外部链接中的作用。通过实例说明,介绍了static修饰全局变量后其内部链接的性质,使得它们仅能在源文件内部访问。
摘要由CSDN通过智能技术生成

关键字

  • 关键字是C语言提供的,不能自己创建
  • 关键字不能做变量名(变量名不能是关键字)

常见关键字

auto  break  case  char const  continue  default  do
double  else  enum  extern  float  for  goto  if  long
register  return  short  signed  sizeof  static  struct
switch  typedef  union  unsigned  void volatile  while

auto : 自动的 - 每个

int main()
{
    int a =10; //自动创建,自动销毁的 - 自动变量
    //auto int a =10; 省略掉了auto
   
    return 0;
}

extern : 用来申明外部符号

register 寄存器关键字

int main()
{
   //大量/频繁被使用的数据,想放在寄存器中,提升效率
   register int num = 100; //建议num的值存放在寄存器中

   return 0;
}

signed : 有符号的

unsigned : 无符号的

static : 静态

union : 联合体(共用体)

void : 空

注意:
define和include不是关键字,是预处理指令

typedef : 类型定义

可以理解为类型重命名

typedef unsigned int u_int;//使用typedef定义u_int变量,实际是unsigned变量

int main()
{
    //unsigned int 定义过于冗长,用typedef来定义一个新变量能简化书写
   unsigned int  num = 100; 
   //上下两个变量完全一样
   u_int num2=100;

   return 0;
}

static 静态的

  • static修饰局部变量
  • static修饰全局变量
  • static修饰函数

static修饰局部变量

void test()
{
    int a =1;
    a++;
    printf("%d",a);
}

void test2()
{
    static int b =1;
    b++;
    peintf("%d",b);
}

int main()
{
    int i = 0;
    while(i<=10) 
    {
       test();
       test2();
       i++;
    }
    return 0;
}

Console:
2 2 2 2 2 2 2 2 2 2 
2 3 4 5 6 7 8 9 10 11

static 使b变得静止,在程序执行完test2的时候,变量b并没有被销毁,而是保留了下来,以至于每次调用test2的时候,并没有新创建b,用的是原来的那个b,并且一直在++。

由此可见:

static修饰局部变量,改变了局部变量的生命周期(本质上是改变了变量的存储类型),可以说static修饰的静态变量生命周期=全局变量的生命周期

static修饰全局变量

文件A
//定义一个全局变量
int g_val = 2022;

我在文件A定义的变量,我想在文件B使用,直接使用会报错:未声明的标识符

文件B

int mian()
{
    printf("%d\n",g_val);
    return 0;
}

Console:
未声明的标识符

我在文件C使用extern声明之后,就可以正常使用文件A定义的变量

int main()
{
    //extern声明外部变量
    extern int g_val;  //extern也可以省略
    printf("%d\n",g_val);
  
    return 0;
}

Console:
2022

如果用static来修饰文件A中的全局变量,能不能被新文件调用全局变量?

文件D

 //全局变量
 static int g_val = 2022;
文件E

extern int g_val;

int main()
{
    printf("%d\n",g_val);

    return 0;
}

Console:

无法解析的外部符号 g_val

可以看到,在经过static修饰以后,即使用extern来声明变量,还是无法调用原本的g_val

全局变量,在其它源文件内部多可以被使用,是因为全局变量具有外部链接属性,但是被static修饰之后,就变成了内部链接属性,其他源文件就不能被链接到这个静态的全局变量。

从上面的例子能总结出static修饰全局变量的作用:
static修饰全局变量,使得这个全局变量只能在自己所在的源文件(.c)内部使用,其他源文件不能使用。

static修饰函数

和全局变量非常相似,函数在一个文件创建,可以在另一个文件,通过声明,就可以使用

文件A

int Add(int x,int y)
{
    return x + y;
}
文件B

//声明函数
extern int Add(int x,int y); //形参可以不用写

int mian()
{
    int a =10;
    int b= 20;
    int sum =Add(a,b);
    printf("sum=%d\n",sum);

    return 0;
}

Console:
sum=30

若使用static修饰函数之后,则和全局变量出现了一样的结果,同样会报错,只是报错的内容不同

文件C

static int Add(int x,int y)
{
   return x + y;
}
文件D

extern int Add();

int mina()
{
    int a =10;
    int b =20;
    int sum =Add(a,b);
    printf("sum=%d\n",sum);

    return 0;
}

Console:
无法解析的外部符号_Add,函数_mian中引用了该符号

static修饰函数,使得函数只能在自己所在的源文件内部使用,不能在其它源文件内部使用

本质上:static是将函数的外部链接属性变成了内部链接属性(和static修饰全局变量一样)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值