C语言中的关键字一共32个;
定义声明最重要的区别:定义创建了对象并为这个对象分配了内存,声明并没有分配内存。
1、最宽恒大量的关键字----auto:编译器在默认的缺省情况下,所有变量都是 auto 的。
2、最快的关键字---- register:这个关键字请求编译器尽可能的将变量存在 CPU 内部寄存器中而不是通过内存寻址访问以提高效率。 register 变量必须是一个单个的值,并且其长度应小于或等于整型的长度。 而且 register 变量可能不存放在内存中, 所以不能用取址运算符“&”来获取 register 变量的地址。
3、最名不符实的关键字----static:
(1)修饰变量:变量分为局部和全局变量,但它们都存在内存的静态区。
静态全局变量,作用域仅限于变量被定义的文件中,其他文件即使用 extern 声明也没法使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。想要使用就得在前面再加 extern ***。恶心吧?要想不恶心,很简单,直接在文件顶端定义不就得了。
静态局部变量,在函数体里面定义的,就只能在这个函数里用了,同一个文档中的其他
函数也用不了。由于被 static 修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。
(2)修饰函数:对函数的作用域仅局限于本文件(所以又称内部函数)
思考题:
#include static int j;
void fun1(void) { static int i = 0; i++; }
void fun2(void) { j = 0; j++; }
int main (void)
{
int k = 0;
for (k = 0; k < 10; k++)
{ fun1(); fun2(); } //i的值是10,j的值是1;
return 0;
}
i 和 j 的值分别是什么,为什么?
答:静态局部变量定义一次,赋值一次,所以每次运行到fun1函数时,每次都会跳过static inti =0;语句,直接运行i++,所以i的值为10;而j的话,每次运行到fun2函数时,j都会被赋值为0,所以j最后的值为1。
4、基本数据类型----short、int、 long、char、float、double
5、最冤枉的关键字----sizeof:sizeof操作符判断它的操作数的类型长度,以字节为单位表示。
(1)sizeof(int)*p 表示什么意思?
留几个问题(讲解指针与数组时会详细讲解),32 位系统下:
(2)int *p = NULL; sizeof§的值是多少? sizeof(*p)呢?
(3)int a[100]; sizeof (a) 的值是多少?sizeof(a[100])呢? sizeof(&a)呢?sizeof(&a[0])呢?
(4)int b[100];
void fun(int b[100])
{
sizeof(b); // sizeof (b) 的值是多少?
}
答:(1)表示计算int型所占字节数,然后再乘以p。
如果是这种形式的话:sizeof(int