C语言知识点总结
内容来自《C语言深度剖析》
1.关键字
C语言中有32个关键字,32个关键字如下(需要注意的是:sizeof是关键字,不是函数):
关键字 | 意 义 |
---|---|
auto | 声明自动变量,缺省时编译器一般默认为auto |
int | 声明整型变量 |
double | 声明双精度变量 |
long | 声明长整型变量 |
char | 声明字符型变量 |
float | 声明浮点型变量 |
short | 声明短整型变量 |
signed | 声明有符号类型变量 |
unsigned | 声明无符号类型变量 |
struct | 声明结构体变量 |
union | 声明联合数据类型 |
enum | 声明枚举类型 |
static | 声明静态变量 |
switch | 用于开关语句 |
case | 开关语句分支 |
default | 开关语句中的“其他”分支 |
break | 跳出当前循环 |
register | 声明寄存器变量 |
const | 声明只读变量 |
volatile | 说明变量在程序执行中可被隐含地改变 |
typedef | 用以给数据类型取别名(当然还有其他作用) |
extern | 声明变量是在其他文件中声明(也可以看做是引用变量) |
return | 子程序返回语句(可以带参数,也可不带参数) |
void | 声明函数无返回值或无参数,声明空类型指针 |
continue | 结束当前循环,开始下一轮循环 |
do | 循环语句的循环体 |
while | 循环语句的循环条件 |
if | 条件语句 |
else | 条件语句否定分支(与if 连用) |
for | 一种循环语句(可意会不可言传) |
goto | 无条件跳转语句 |
sizeof | 计算对象所占内存空间大小 |
2.定义与声明的区别
定义:就是(编译器)创建一个对象,为这个对象分配一块内存并给它取上一个名字,这个名字就是所谓的变量名或对象名。
一个变量或对象在一定的区域内(比如函数内,全局等)只能被定义一次,如果定义多次,编译器就会提示重复定义同一个变量或对象
声明:有两重含义:
第一:告诉编译器,这个声明的名字已经匹配到一块内存上,在其下面的代码用到该变量或对象是在别处定义的。声明可以出现多次。
第二:告诉编译器,该名字先预定,别的定义再也不能用它来作为变量名或对象名。
举例:
a) int i; ——定义
b) extern int i; ——声明
定义与声明的最重要的区别:
定义创建了对象并为这个对象分配了内存空间,声明没有分配内存空间!
3.关键字解析
3.1 auto
在缺省的情况下,所有的变量都是auto的。
3.2 register
该关键字请求编译器尽可能的将变量存在CPU内部寄存器中而不是通过内存寻址访问以提高效率。
注:
1) 此处是尽可能,不是绝对的。因此CPU的寄存器的数目是有限的。若定义了太多的register变量,就会没有足够的寄存器可用
2) register变量必须是能被CPU寄存器所接受的类型,也即register变量必须是一个单个的值,并且其长度应小于或等于整型的长度。而且register变量可能不存放在内存中, 所以不能用取址运算符”&“来获取register变量的地址。
3.3 static
在C语言中,该关键字主要有两个作用,在C++中对该关键字进行了扩展。
第一个作用:修饰变量。
变量分为局部和全局变量。但它们都存在内存的静态区。
静态全局变量,作用域仅限于变量被定义的文件中, 其他文件中即使使用extern声明也无法使用它。换种说法就是作用域从定义之处开始,到文件结尾处结束。在定义处前面的那些代码行也不能使用它,若想使用它,就得在前面再加extern ***。
静态局部变量,在函数体里面定义的,就只能在这个函数里用,同一个文件中其他的函数也用不了。
由于被static修饰的变量总是存在内存的静态区,所以即使这个函数运行结束,这个静态变量的值还是不会被销毁,函数下次使用时仍然能用到这个值。
第二个作用:修饰函数。
函数前面加上static使函数成为静态函数。
此处,”static“的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又成为内部函数)。
这样的好处是:不同的人编写不同的函数时,不用担心自己定义的函数是否会与其他文件中的函数同名。
3.4 基本数据类型----short、int、long、char、float、double
C语言包含的基本数据类型如下图所示:
3.5 extern
关键字extern置于变量或者函数前,以标示变量或函数的定义是在别的文件中。下面的代码用到的这些变量或函数在其他文件中,不是本文件定义的,提示编译器遇到此变量和函数是在其他模块中寻找其定义。
此处对extern ”C“进行说明(属于C++语言范畴):
extern "C"表明了一种编译规约,其中extern是关键字属性,“C”表征了编译器链接规范。对于extern "C"可以理解成在C++/C中的混合编程的编译指令。
明白了这层意思,下面的代码就不难解释了:
明白了这层意思,下面的代码就不难解释了:
#ifdef __cplusplus /*如果采用了C++,如下代码使用C编译器;*/
extern "C" /*如果没有采用C++,顺序预编译
{
#endif
/*代码段*/ /*采用C编译器编译的C语言代码段*/
#ifdef __cplusplus /*结束使用C编译器*/
}
#endif
3.6 typedef
typedef的作用分为如下:
1) 为现有类型创建一个新的名字。
例如:typedef int size;
注:typedef并不创建新的类型,仅仅是为现有类型另取一个名字而已
2)typedef还可以掩饰符合类型,如指针和数组,
例如:
typedef char Line[81];
Line text, secondline;//表示char text[81], secondline[81];
typedef char* pstr;//隐藏指针
int mystrcmp(pstr, pstr);
1) 为现有类型创建一个新的名字。
例如:typedef int size;
注:typedef并不创建新的类型,仅仅是为现有类型另取一个名字而已
2)typedef还可以掩饰符合类型,如指针和数组,
例如:
typedef char Line[81];
Line text, secondline;//表示char text[81], secondline[81];
typedef char* pstr;//隐藏指针
int mystrcmp(pstr, pstr);
3.7 struct与class的区别
在C++中,struct关键字与class关键字一般可以通用,
它们只有一个很小的区别:
struct的成员默认情况下属性是public的。
而class成员默认情况下属性是private的。
既然struct与class可以通用,那么也就说明了结构体内也是能放函数的。