register,static,const,extern,typedef,volatile的详讲

来源:互联网 发布:大数据挖掘工程师招聘 编辑:程序博客网 时间:2024/06/14 00:47

1.register
  修饰经常被访问的变量,它所修饰的变量,请求编译器的尽可能的将变量保存在cpu的寄存器中。这样有助于减少访存的时间
  有助于程序的效率。
  它所修饰的变量不能用&地址,因为&这个是取的是内存空间的的地址,但是register 修饰的的变量保存在寄存器里面。
  还有register只能修饰cpu能够接受的类型,例如cpu是不能进行浮点类型的计算。
   register修饰的是局部变量不能修饰全局变量,因为只有这个进程知道这个变量的在哪里保存着,而其它的进程不知这个
   变量保存的地方。
2.static
  static不仅可以修饰变量还能修饰函数
  修饰变量的时候,能修饰局部变量和全局变量。
  修饰局部的变量,主要是为延长变量的生命的周期,需要延长生命周期的的变量不定义成全局变量,这是因为全局变量谁都
可以访问,容易被修改。
  修饰全局变量的时候,使这个全局变量只能在这个文件中使用,也有助于其他文件对于这个变量名重新定义。
  修饰函数的时候,也是是这个函数只能在本文件里面调用,其它文件不能调用。
  被static修饰的变量保存在内存的数据段中的data段里面,只有在程序结束的时候,空间才会释放。
3.const
   const修饰的变量名,是只读变量,
   什么是只读变量:
   const int num = 5;
   num = 6;//这是错误的,
   int *p = #
   *p = 6;
   这样是可以的,所以constz修饰的变量只是不能通过变量名字来改变其值,但是空间里面的值是可以被改变的
   const int *p;
   int * const p;
   这两个是不一样的,一个是*p不能被改变,下面一个是p不能被改变。(就近原则)
   const主要的用途是函数传参的时候,修饰形参的。因为在函数传参的时候,容易照成错误的通过修改的形参的值从而来
   修改到实参的值。
   举个例子:strcpy这个函数 函数的声明  char * strcpy(char *dest,const char *src );这个函数只需要将src字符串
  拷贝给dest就好了,只需要只读,不需要改变,一旦在函数在定义的时候,一旦改变了*src,那么编译器会直接的报错。
  防止在赋值的时候,做了其它的操作修改原来的字符串。
4.extern
  extern int count;
  这个含义是说明count在其它的文件里面定义过,再用extern的时候需要标明其变量的数据的类型;
  extern也可以修饰函数,也需要标明函数返回值,以及参数的类型。
5.tpyedef
  是帮一个复杂的声明定义取一个简单的名字(简单不失越短越好,有时候起到一定的注释代码的作用,可以取多个名字)
  ,可以理解为取别名,
  俗一点的说,你大名叫上官阳阳,但是人家里面,家里人叫你的小名阳阳,同学有时候叫你啊阳,代表的是同一个人。
  主要的好处:
  1.提高了代码的移植性。例如你在一个很长的代码里面多次用到unsigned char 取名字为Char ,突然有一天需要变成
   signed char的时候,只需要,将typedef unsigned char  Char,改为typedef signed char  Char
  2.方便在编程中起名字的话,起到一个注释的作用(一个声明定义可以取多个名字)
  3.方便简化变量的定义,例如一个结构体,你每次用它需要两个单词,但是typedef以后为一个单词。
  注意一下,toyedef后面需要加分号,#define后面不需要加分号,不要搞混了。

6.voatile
   提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,
   都会直接从变量地址中读取数据。如果没有volatile关键字,则编译器可能优化读取和存储,可能暂时使用寄存器中的值,
   如果这个变量由别的程序更新了的话,将出现不一致的现象。
   注意使用volatile的时候不用使用编译优化。

   注:对于现在的我来说可能详讲。

 

 

0 0
原创粉丝点击