您的位置:首页 > 编程语言 > C语言/C++

C语言关键字学习总结

2015-09-19 16:26 441 查看
关键字总结:

-------------------------------------------

定义和变量的区别:

1. 定义创建了对象,并且为这个对象分配了内存;声明没有分配内存。

2. 变量一旦被定义,意味着编译器分配了一块内存给它,并为它起了一个名字,也就是我们说的对象或者变量名;这个变量在一定的区域内只能被定义一次,如果定义多次就会提示你重复定义;

3. 变量和这块内存是绑定的,内存的位置也是不能改变的。

4. 举例:

int
i;--------定义;

extern
int i;--------声明;

函数参数的声明:

void
fun(int i, int j);

-------------------------------------------

auto:最宽宏大量的关键字,编译器在默认的缺省情况下,都认为是auto的。

-------------------------------------------

register:寄存器变量,请求编译器“尽可能的”把变量存在CPU寄存器中,而不是通过内存寻址访问;这样可以提高访问效率和速度,注意:尽可能,也就是说你定义了很多register,但是CPU就那么几个或者几十个寄存器,不可能把所有的register变量都放进去吧,所以是尽可能。

好的比喻:CPU通过寄存器来读写内存中的数据;

CUP:皇帝

寄存器:太监

内存:大臣

大臣给皇帝看奏折需要先呈给太监,再由太监交给皇帝处理,皇帝看完后进行操作(计算),然后返还给太监,再由太监交给大臣,完成一个交流的过程。我们的这个寄存器离皇上近,所以速度快,直接可以和皇帝交互。

问题:为什么不把内存和硬盘都弄成寄存器呢?

答案:你真有钱!

另外:register变量虽然速度快,但是也是有限制的:

1. register变量必须能被CPU寄存器所接受的类型;

2. 必须是一个单个的值,并且长度应该小于等于整形的长度;

3. register变量不能通过取址操作“&”来获取此变量的地址;

-------------------------------------------

static:看上去一直很安静,其实最不老实;

作用:

1. 修饰变量:全局和局部变量,使得它们都存在内存的静态区;

2. 静态全局变量:作用域只限于变量被定义的文件中,其他文件即使使用“extern”也无法访问;

作用域是从定义之处开始,到文件结尾处,在定义之处前面的那些代码行也无法使用它,很恶心吧?

那应该怎么办?直接定义在文件顶端就可以了。

3. 静态局部变量:在函数体里面定义的,就只能在这个函数中使用,同一个文档中的其他函数也用不了;

由于被static修饰的变量是存在静态区,所以即使这个函数运行结束,这个静态变量值也不会被销毁,

函数下次使用时,仍然能用到这个值。

4. 修饰函数:在函数前加上static可以使函数成为静态函数,此处的static不是指内存存储方式,而是指对函数的作用域仅仅局限于本文件,所以又称为内部函数;这样做的好处是,不同的人编写不同的函数,不用担心自己定义的函数,是否和其他文件的函数同名,因为外部文件的函数访问不了此文件中的函数,我更喜欢叫它文件域函数;总之,static最常见的是用来定义其他文件不能访问的全局变量和函数。

----------------------------------------

sizeof:是关键字而不是函数;

如果我们想知道我们的机器是不是32位的机器,我们可以这样:

int i = 0;

sizeof(int)或者sizeof(i),结果如果是4,表示占四个字节,那么就是32位的机器;在32位的机器上,long和int的数据范围是相同的,如果想定义64位的数据,可以采用long long i;为什么说sizeof不是函数呢,如果你这样使用:sizeof i,得出的结果也是4,有函数后面不加括号的参数吗?关键点:sizeof()在计算变量所占空间大小时,括号可以省略,但是在计算类型大小比如int,short,const等关键字时,是不能省略的,你想一下,int是一个关键字,在一个关键字前再加一个关键字是什么?类型扩展?显然不是!我们平时最好别偷懒,就把它当做函数,后面括号最好一直有,别省略,你知道就当不知道这个括号还能去掉呢?!呵呵。

举例1:

int *p = NULL;

sizeof(p)为4;

sizeof(*p)为4;

解释:

sizeof(p) = sizeof(int*) = 4,是说指针占用几个字节

sizeof(*p) = sizeof(int) = 4,是说整型数占用几个字节

举例2:

int a[100];

sizeof(a)为400;表示整个数组所占空间字节数是多少;在sizeof()里,数组名 是表示整个数组的大小,而不是首元素的地址;

int a[100]:声明了一个有100个int类型元素的数组,数组下标从0~99, 所以a是数组名, 代表数组的首地址,

也就是&a[0], sizeof(a)返回数组a在内存中所占的空间大小,

以字节为单位, 也就是sizeof(a) = sizeof(int) * 100 = 4 * 100 = 400bytes

sizeof(a[99])为4;由于a是个int类型的数组, 它其中的每个元素都是int类型的, sizeof(a[99]) = sizeof(int),

int类型在32位机器中的大小是4个字节, 所以sizeof(a[99]) = 4;

sizeof(&a[0])为4;地址表示一个指针类型,表示指针所占的字节数;

sizeof(&a),为4;表示指针所占的字节数;

举例3:

int b[100];

void fun(int b[100])

{

int
i = sizeof(b);//i的值为4;

}

这里传进来是一个地址,是一个指针。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: