关键字总结:
-------------------------------------------
定义和变量的区别:
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;
}
这里传进来是一个地址,是一个指针。
-------------------------------------------
定义和变量的区别:
1. 定义创建了对象,并且为这个对象分配了内存;声明没有分配内存。
2. 变量一旦被定义,意味着编译器分配了一块内存给它,并为它起了一个名字,也就是我们说的对象或者变量名;这个变量在一定的区域内只能被定义一次,如果定义多次就会提示你重复定义;
3. 变量和这块内存是绑定的,内存的位置也是不能改变的。
4. 举例:
-------------------------------------------
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])
{
}
这里传进来是一个地址,是一个指针。