zlgyp

c语言关键字

2012-07-02 13:32  梁晓  阅读(348)  评论(0编辑  收藏  举报

  1.定义与声明最重要的区别:定义创建了对象并为这个对象分配了对象内存,声明没有分配内存。声明告诉编译器,这个名字已经匹配到了一块内存上,下面代码用到的变量和对象都是在别人的地方定义的。

2. 关键字-register:这个关键字请求编译器尽可能地将变量存在CPU的内部寄存器中,而不是通过内存寻址访问提高效率。使用register的限制:register变量必须是能被CPU寄存器所接受的的类型。register变量必修是一个单值,并且长度小于等于整型的长度,而且寄存器变量可能不存放在内存中,所以不能使用取地址运算符&来获得寄存器register变量的地址。

3. 关键字-static:c语言中关键字static的两个作用:

 (1)修饰变脸。变量又分为全局变量和局部变量,但他们都存在内存的静态区。静态全局变量,作用域限于变量被定义的文件中,其他文件中使用extern声明也没有办法使用它。静态全局变量的作用域是从定义的之处开始到文件结尾结束,在定义之处之前使用它也不行。静态局部变量是在函数体里面定义的,就只有这个函数能使用, 该变量存在于内存的静态区,只被分配一次,下次调用函数时任然维持上次的值。

(2)修饰函数。在函数前面加static使函数成为静态函数,它的作用域被限制与本文件。使用static的好处就是不用担心自己定义的函数与其他文件中的函数同名。

         在c++除了上面两个作用之外 ,还可以在类的成员之前加static关键字,类中的static成员变量属于整个类所以,对类的所以对象只有一份拷贝,并且在算类的大小或者类对象的大小时,静态成员的大小不会算。

#include<iostream> 
usingnamespace std;

class People {
public:
    static int year;
    int sex;
};
int main()
{
    People lisi;
    cout<<"sizeof(People)="<<sizeof(People)<<endl;
    cout<<"sizeof(lisi)="<<sizeof(lisi)<<endl;
    return 0;
}

 输出结果是  

 

       在修饰类的成员函数时,整个函数不能接受this指针,因而只能访问内中的static成员变量或者不访问成员。可以通过作用域符从类直接调用static成员,或者通过对象、引用和指针间接调用。

4.关键字—volatile:表示变量可能被意想不到因素的改变,使用volatile关键字,编译器在编译期间对访问该变量的代码不在优化,而是每次都从新读取这个变量的值,而不是使用保存在寄存器的里面的值。使用volatile的情况 

 (1)并行设备的硬件寄存器

 (2)多线程中多个任务共享的变量

(3)一个中断服务子程序中访问到的非自动变量 (全局变量和静态变量)

5. 柔性数组,在C99中的最后一个元素允许是未知大小的数组,就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少有一个其他的成员。 柔性数组成员允许结构中包括一个未知大小的数组。sizeof返回这种结构大小不包括柔性数组的内存。

typedef struct st_type 

int nCnt; 
int item[];}type_a; 

  用sizeof(type_a)得到的只有4,就是sizeof(nCnt)=sizeof(int),那个0个元素的数组没有占用空间。

         type_a *p = (type_a*)malloc(sizeof(type_a) +100*sizeof(int));  

柔性数组其实与结构体没什么关系,算不上结构体的正式成员。柔性数组的作用就是只需要一次就能分配内存  nCnt 和item数组的内存。

6.const 与 typedef使用的区别

 const int a与int const a 是表示同一个意思const修饰对象a。 

 const int * p 与int * const p 表达两个不同的意思,一个const修饰指针指向的对象,一个是const修饰指针 。

而利用typedef进行别名定义后 

typedef struct student
{
    int name;
}Stu_st,*Stu_pst;  

  const Stu_pst  stu 与 Stu_pst const stu 都是修饰指针stu而不是它指向的对象,因为编译器把Stu_pst作为一个类型,那这个const作用就和const int a与int const a一样,而不是像const int * p 修饰p指向的对象。

        


 

 

分类:

技术点:

相关文章: