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成员变量属于整个类所以,对类的所以对象只有一份拷贝,并且在算类的大小或者类对象的大小时,静态成员的大小不会算。
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返回这种结构大小不包括柔性数组的内存。
{
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进行别名定义后
{
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指向的对象。