----------------------------------------------------------------函数-----------------------------------------------------------
函数:由函数首部(或称函数头)和函数体两部分组成。
定义格式:数据类型 函数名(参数列表){
函数体
}
函数原型定义方式:数据类型 函数名(参数列表);其中函数列表中的函数名是可以省略的。
函数的return 值的类型应该与函数定义时的数据类型一致,如果不一致时,编译器将进行字段转换,
如果转换失败,则会出错。即函数返回值的类型是由函数定义的数据类型决定的。
函数的形式参数列表中的变量只有当函数被调用时,其内存单元才会被分配。当被调函数遇到return语句或者函数结束括号时,函数调用结束,形参的内存单元将会被释放。
--------------------------------------------------作用域、链接和存储期-------------------------------------------------
一个C变量的作用域可以是块作用域、函数作用域、函数原型作用域
C99标准的块概念:扩展到了for循环、while循环、do while循环和if语句所控制的代码,即使这些代码没有括号括起来,也算块的一部分。
翻译单元:编译器把源代码文件和所有的头文件都看成一个包含信息的单独文件,这个文件被称为翻译单元。每个翻译单元包含一个源程序和它所包含的文件。
链接:分为外部链接、内部链接和无链接。
外部链接可以在多个文件程序中使用,内部链接只能在一个单一单元中使用。
对于文件作用域变量,关键字static表明了其链接属性,即使用static的文件作用域是内部链接。
存储期(生存期):静态存储期、线程存储期、自动存储期、动态分配存储期。
静态存储期:程序执行期间一直占用内存单元。所有文件作用域变量都具有静态存储期。
线程存储期:用于并发设计、程序执行可被分为多个线程。从被声明到线程结束期间一直存在。
自动存储期:块作用域中的变量通常都是自动类别,进入程序块开始分配内存,退出块时释放分配的内存单元。
块中的局部变量若是想要具有静态存储期,只需要在变量的前面添加static。
自动变量、寄存器变量、静态变量:自动变量使用关键词auto声明,不进行显式的初始化时,其内存的值是不确定的;
寄存器变量使用关键词register声明,存储在CPU的寄存器中;
静态变量使用关键词static声明,不进行显式初始化时,其内存的值是0;
外部链接静态变量使用extern声明,如果想要使另一个文件中的外部静态变量,则必须使用extern进行声明。
----------------------------------------------------------结构体--------------------------------------------------------------
结构体定义:struct [结构标记]{
其他数据类型变量定义1;
其他数据类型变量定义2;
......
}
结构体变量定义:1.定义结构体时定义变量,如:struct [结构标记]{
其他数据类型变量定义;
.....
} 变量名;
2.定义结构体后,再定义变量,假设 message 是定义的结构体类型,可使用如下结构体定义:
struct message var; //var则是一个结构体变量
结构体变量初始化:与数组初始化类似,使用花括号{},C99和C11标准提供了指定初始化器,即在初始化时使用 .成员变量 的方式进行初始化。
结构体变量名与数组变量名不一样,结构体变量名单纯的为一个标识符,而数组名是数组首元素的地址。
指向结构体变量的指针可使用 -> 运算度访问成员变量;
结构体变量可使用 . 访问成员变量;
->和.的优先级是最高的。
结构体变量可以作为一个整体赋值给另外一个结构体变量。