平时未注意或不常使用的关键字:
auto 声明自动变量,缺省时编译器一般默认为auto
union 声明联合体数据类型
enum 声明枚举类型
register 声明寄存器变量
volatile 说明变量在程序执行时可被隐含地改变
extern 声明变量是在其他文件中声明(也可以看作是引用变量)
sizeof 计算对象所占的内存空间大小(计算变量所占空间时,可省略括号,计算类型所占空间时,不可省略括号)
void fun(int a[100])
{
cout << "sizeof(a) = " << sizeof(a) << endl;
}
int main(int argc, char* argv[])
{
int *p = NULL;
int a[100];
cout << "sizeof(p) = " << sizeof(p) << endl;
cout << "sizeof(*p) = " << sizeof(*p) << endl;
cout << "sizeof(a) = " << sizeof(a) << endl;
cout << "sizeof(a[100]) = " << sizeof(a[100]) << endl;
cout << "sizeof(&a) = " << sizeof(&a) << endl;
cout << "sizeof(&a[0]) = " << sizeof(&a[0]) << endl;
fun(a);
return 0;
}
运行结果:
sizeof(p) = 4
sizeof(*p) = 4
sizeof(a) = 400
sizeof(a[100]) = 4
sizeof(&a) = 4
sizeof(&a[0]) = 4
sizeof(a) = 4
register:这个关键字请求编译器尽可能地将变量存在CPU内部寄存器中,register变量必须是能被CUP寄存器所接受的类型。这意味着它必须是单个的值,其长度等于或小于整型的长度。register变量可能不存放在内存中,不能用取值运算符“&”来获取其地址。
static:
1.修饰变量
静态全局变量:作用域仅限于变量被定义的文件中(从定义之处开始到文件结尾处结束),其他文件即使使用extern声明也无法使用它。定义之前的代码也不能使用它,需加extern才能使用。默认初始值为0。
静态局部变量:在函数体内定义,就只能在该函数内使用。函数运行结束,该变量也不会销毁,函数下次使用时仍能使用该值。默认初始值为0。
static int j;
void fun1()
{
static int i = 0;
++i;
cout << "i = " << i << endl;
}
void fun2()
{
j = 0;
j++;
cout << "j = " << j << endl;
}
int main(int argc, char* argv[])
{
for (int k = 0; k < 3; ++k)
{
fun1();
fun2();
}
return 0;
}
运行结果:
i = 1
j = 1
i = 2
j = 1
i = 3
j = 1
2.修饰函数
指对函数的作用域仅局限于本文件。这样,不同人编写不同的函数时,不用担心同名。
关键字static有着不寻常的历史。起初是为了表示退出一个块后仍存在的局部变量。后来又用来表示不能被其他文件访问的全局变量和函数。
union:
可以利用union类型数据测试系统的存储模式。
大端模式(Big_endian):字数据的高字节存储在低地址中,低字节存储在高地址中。
小端模式(Little_endian):字数据的高字节存储在高地址中,低字节存储在低地址中。
//if Little_endian?
bool checkSystem()
{
union check
{
int i;
char ch;
}c;
c.i = 1;
return(c.ch == 1);
}
在vs2010上的测试结果为小端模式。
int a[5] = {1, 2, 3, 4, 5};
int *ptr1 = (int *)(&a + 1);
int *ptr2 = (int *)((int)a+1);
printf("%x, %x/n", ptr1[-1], *ptr2);
运行结果:5, 2000000