结构体
有事要将不同类型的数据组合成一个有机的整体,以便于引用
格式
struct 结构名
{
成员列表
};
成员列表由若干成员组成,每个成员都是之歌结构的一个组成部分,对每个成员也必须作类型说明。格式为
类型说明符 成员名;
格式2
struct 结构名
{
成员列表
}变量名表列;
格式3
struct
{
成员列表
}变量名列表
结构体可以嵌套
注意
不能将一个结构体变量作为一个整体进行输入和输出
正确引用方式
结构体变量名.成员名
"."是成员(分量)运算符,它在所有的运算符中优先级最高,因此可以把xxx.num作为一个整体看待,上面赋值语句的作用是将整数100赋给xxx变量中的成员num。
如果成员本身又属于一个结构体类型,则要若干个成员运算符,一级一级的找到最低的一级的成员,只能对最低的成员进行赋值或存取以及运算
可以引用结构体变量成员的地址,也可以引用结构体变量的地址
结构体变量的地址主要用作函数参数,传递结构体变量的地址
需要注意的是,结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储
当你的结构体变量中有存放多个字符的成员,建议你将它定义为数组
不知道数组该开辟多大时,也可以定义为指针。原因是指针变量不能存放实际数据,仅仅是地址。
结构体指针变量说明的一般形式为:
struct 结构名 *结构指针变量名;
赋值是把结构变量的首地址赋予该指针变量不能把结构名赋予该指针变量
a1.num a2.num
等同
(*a1).num (*a2).num
等同
a1->num a2->num
一个include命令只能指定一个被包含文件,若有多个文件要包含,则需要用多个include命令
文件包含允许嵌套,即在一个被包含的文件中有可以包含另一个文件。
包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来
#include"stdio.h"
#include<math.h>
但这两种是有区别的,使用尖括号表示在包含文件目录中查找(包含目录是由用户在设置环境时设置的),额不再源文件目录中查找
使用双引号则表示首先去当前的源文件目录中查找,若未找到才到包含目录中去找
预处理程序提供了条件编译的功能,可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件,有利于程序的移植和调试
#ifdef 标识符
程序段1
#else
程序段2
#endif
如果表示符已被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译
如果else中为空,那么可以不写else
#ifndef 标识符
程序段1
#else
程序端2
#endif
意思是如果标识符没被定义,则走程序段1,反之走2
#if 常量表达式
程序段1
#else
程序段2
#endif
看常量表达式是1还是0,是1会执行程序段1,否则执行程序段2
C语言允许宏带有参数,在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数
带参数的宏,再掉用中,不仅要宏展开,而且要用实参去代换形参
带参宏定义 格式:
#definr 宏名(形参表) 字符串
注意
带参宏定义中,宏名和形参表之间不能有空格出现
例如
#define max(a,b) (a>b)?a:b
写为
#define max (a,b) (a>b)?a:b
这样系统会把max作为宏名字 后面的报错
在带参宏定义中,形式参数不分配内存单元,因此不必做类型定义,而宏调用中的实参有具体的值,要用它们去代换形参,因此必须作类型说明,这是与函数不同的地方
在函数中形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”,而在带参宏中,只是符号代换,不存在值传递的问题
在宏定义中的形参是标识符,而宏调用中的实参可以是表达式
在宏定义中,字符串内的形参通常要用括号括起来以避免出错,例如(a)*(a)