当前位置:网站首页>c语言中的六个存储类型:auto register static extern const volatile

c语言中的六个存储类型:auto register static extern const volatile

2022-07-25 09:08:00 lhb2998658795

1.auto:

自动类型的变量(非自动类型的变量:全局变量,或者static修饰的变量)自动类型的变量前默认缺省auto,在实际的工作开发过程中是见不到的。

2.register:修饰的是寄存器变量

  1.register修饰的变量要比普通的变量运算效率高(但不能把所有的变量都定义成register修 的, 因为寄存器在芯片内部是有个数限制的)
  2.register修饰的变量不能够取地址

3.static

3.1static的作用:

        1.static局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。再次调用该函数可以再次使用。

        2.static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以。

        3.static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。初始化的时候自动初始化为0

          (1)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束释放可以使用static修饰

          (2)考虑到数据安全性(当程想要使用全局变量的时候应该先考虑使用static

3.2static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

1)static修饰的全局变量和去普通的全局变量一样都分配在静态区,但是普通的全局变量,它作用于整个源代码,当如果出现同名的全局变量时,只能有一个初始化,不然就会连接失败,而static修饰的全局变量,只作用于本文件中,在其它文件中不起作用,因此可以避免在其它源文件中引起错误。

2)static局部变量只初始化一次,下一次的值依据上一次的结果值,从而延长了生命周期,而局部变量如果程序结束再次开始时候,又将被重新定义。

3)static函数在内存中只有一份,普通函数爱每个被调用中维持一份拷贝。

4.extern:修饰调用的变量或者函数是在其他文件中的  

 extern int num;    //extern修饰的num变量不能赋初值,只起到声明的作用
                    //如果修饰的变量是其他文件中的,变量前一定要加extern
 extern int add(int ,int );//声明函数的时候可以加也可以不加

5.const:在谁前谁就不能被修改

   const:修饰的是只读的变量(const修饰的不是常量)
   const int a=10;  //a的值不能够修改了
      
   const int *p = &a; //p可以修改,*p不能修改
   int const *p = &a;//p可以修改,*p不能修改
   int *const p = &a//p不可以修改,*p可以修改   //const在谁前谁就不能更改
    
  注:const修饰的局部变量在栈空间,const修饰的全局变量在.ro段

1.欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了;

 2.对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或      二者同时指定为const

 3.在一个函数声明中,const可以修饰形参表明他是一个输入参数,在函数内部不可以改变其值;

  4.对于类的成员函数,有时候必须指定其为const类型,表明其是一个常函数,不能修改类的变量;

  5.对于类的成员函数,有时候必须指定其返回值为const类型,以使得其返回值不为左值

6.volatile

volatile:易变的
    如果使用volatile修饰变量,变量每次都会从内存中获取值,不从缓存中获取值。
        
    使用的场景:
     1.对应硬件寄存器前最好加上volatile  
        请向0xaabbccdd地址中写0x12345678的值?
        #define P (volatile unsigned int *)0xaabbccdd
        *P = 0x12345678;
        2.在多线程中访问全局,这个全局变量就需要加volatile   
        3.在中断中访问非自动类型的变量

原网站

版权声明
本文为[lhb2998658795]所创,转载请带上原文链接,感谢
https://blog.csdn.net/a2998658795/article/details/125958396