首页 > 其他分享 >C温故补缺(三):存储类声明符(auto,register,extern,static)

C温故补缺(三):存储类声明符(auto,register,extern,static)

时间:2022-11-10 22:44:09浏览次数:38  
标签:变量 int auto register static extern main 温故 函数

auto,register,extern,static

四个存储类声明符,用于定义变量/函数的作用域声明周期

auto:自动变量,即普通变量,在平时定义变量时会自动赋予其auto类型

被auto修饰的变量的调用是通过函数栈的.

如:

分别在主函数main()中和自定义函数fun1()中定义了一个变量

进去函数内部时可以看到有两个函数栈

fun1()栈调用变量x

main()栈调用变量a

register:用它修饰的变量会被cpu优化,将其存入cpu,调用变量就不再通过函数栈,这一操作能大大提高访问变量的速度

可以看到,调试到最后,main()函数栈中也只有a这一个变量,此时变量b位于cpu中

因为存在寄存器中,所以不能用指针来取其值

查看反汇编代码:

如图,变量a由BP存着其地址-0x54(位于存储器),而变量b则存于BX寄存器

若只定义register 类型的变量,并不会看到BX中的b,必须调用才能看到

extern:在一个文件中,extern用来声明全局变量,类似于定义在main()函数后的函数,若要调用,需要在main函数前写其声明.而extern就是声明全局变量的

#include <stdio.h>
int main(){
   extern int a;
   printf("%d",a);
}

int a;

另一种情况:文件之间

一个文件中的全局变量,可以被另一个文件通过extern访问,a.c中定义的时候,不能用extern

达到这种效果的另一种方法是用头文件:

如:

static:能够使变量的声明周期延长至整个程序结束,但并不改变变量的作用域

如:

#include <stdio.h>
void fun(){
   int i=0;
   i++;
   printf("%d ",i);
}

int main(){
   int j=0;
   while(j<3){
      fun();
      j++;
   }
}

当fun()周期结束时,变量i,也会被释放

但如果加上static就可以保留

如:

#include <stdio.h>
void fun(){
   static int i=0;
   i++;
   printf("%d ",i);
}

标签:变量,int,auto,register,static,extern,main,温故,函数
From: https://www.cnblogs.com/Tenerome/p/Creview3.html

相关文章

  • C温故补缺(二):volatile
    volatile参考:CSDNvolatile也是一个类型修饰符,被其修饰的变量意味着可以被某些编译器未知的因素修改,如操作系统,硬件,线程等.当遇到volatile修饰的变量时,编译器对访......
  • C温故补缺(一):数据类型和基本类型占位
    数据类型基本类型:就是算术类型,包括整型和实型枚举类型:一组离散的整数void类型:无可用值类型派生类型:指针(*),数组([]),结构体(struct),共用体(union),函数(fun())......
  • python中@classmethod @staticmethod的使用方法及区别
    https://stackoverflow.com/questions/136097/difference-between-staticmethod-and-classmethod@staticmethod:如果类里面不想某个方法使用类属性和调用其它方法就可以使......
  • static和extern
    static和extern1.这是我们C语言中的两个关键字.是用来修饰变量和函数1),static和extern修饰局部变量的效果2)。static和extern修饰全局变量的效果3),static和extern修饰函数的......
  • Elastaticsearch 集群部署
    系统Ubuntu16.04Elastaticsearch5.6.9Kibana5.6.9官网地址https://www.elastic.co/products/elasticsearch主机名称IPes-n1192.168.175.76......
  • 关于static变量
    #include<cstdio>#include<iostream>usingnamespacestd;voidtest0(){for(inti=1;i<=3;i++){staticintsum=0;sum++......
  • 接口中得static属性
    我们都知道子类继承父类的时候能继承父类的static属性修饰的方法,但是无法重写父类的static属性修饰的方法。  publicclassFather{publicstaticvoidsout(){......
  • 小新学Java5-【String类、static关键字、Arrays类、 Math类】
    一、String类1.String类概述 创建字符串的3+1种方式:三种构造方法:①publicString():创建一个空白字符串,不含任何内容。②publicString(char[]array):根据字符数组的......
  • static_cast和dynamic_cast详解(转载,不错的文章就转载了,作为收藏吧)
    派生类不仅有自己的方法和属性,同时它还包括从父类继承来的方法和属性。当我们从派生类向基类转换时,不管用传统的c语言还是c++转换方式都可以百分百转换成功。但是可怕是向......
  • C 语言 register 关键字
    在C语言中,register算是不太难的一个关键字。用register声明的变量是寄存器变量,是存放在CPU的寄存器里的。寄存器有这么两个特点,一个是运算速度快,一个是不能取地址。——......