一、结构体定义
结构体分为三种定义形式
1.先声明结构体类型再定义变量名
如上面已定义了一个结构体类型 struct student,可以用它来定义变量。
struct student{ //结构体类型名
...
...
...
}student1, student2 //结构体变量名
2.在声明类型的同时定义变量
结构体的一般形式如下:
struct 结构体名
{
成员表列
}变量名表列;
例如:
struct student
{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
}student1, student2;
3.直接定义结构类型变量
其一般形式为:
struct
{
成员表列
}变量名表列;
即不出现结构体名。
二、结构体引用
1.不能将一个结构体变量作为一个整体进行输入和输出。只能对结构体变量中的各个成员分别进行输入输出。引用结构体变量中的成员的方式为:结构体变量名.成员名。
2.如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。只能对最低的成员进行赋值或存取以及运算。
3.对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)
student2.score = student1.score;
sum = student1.score + student2.score;
student1.age ++;
++ student1.age;
4.可以引用结构体变量成员的地址。也可以引用结构体变量的地址 。
三、typedef
可以使用 typedef 来为用户自定义的数据类型取一个新的名字。例如,您可以对结构体使用 typedef 来定义一个新的数据类型名字,然后使用这个新的数据类型来直接定义结构变量。
#include <stdio.h>
#include <string.h>
typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
int main( )
{
Book book;
strcpy( book.title, "C 教程");
strcpy( book.author, "Runoob");
strcpy( book.subject, "编程语言");
book.book_id = 12345;
printf( "书标题 : %s\n", book.title);
printf( "书作者 : %s\n", book.author);
printf( "书类目 : %s\n", book.subject);
printf( "书 ID : %d\n", book.book_id);
return 0;
}
四、宏定义
1.定义
在 C 语言中,宏分为 有参数和无参数两种。无参宏的宏名后不带参数,其定义的一般形式为:#define 标识符 字符串
宏定义在 C 语言源程序中允许用一个标识符来表示一个==字符串==,称为“==宏/宏体==” ,被定义为“宏”的==标识符==称为“==宏名==”。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的字符串去代换,这称为“==宏替换==”或“==宏展开==”。 宏定义是由源程序中的宏定义命令完成的,宏代换是由预处理程序自动完成的。
// 不带参数的宏定义
#define MAX 10
/*带参宏定义*/
#define M(y) y*y+3*y
/*宏调用*/
k=M(5);
2.优点
方便程序的修改提高程序的运行效率。
五、条件编译
条件编译是通过预编译指令来实现的,主要方法有:
#if 条件 1
代码段 1
#elif 条件 2
代码段 2
...
#elif 条件 n
代码段 n
#else
代码段 n+1
#endif
即可以设置不同的条件,在编译时编译不同的代码,预编译指令中的表达式与C语言本身的表达式基本一至,如逻辑运算、算术运算、位运算等均可以在预编译指令中使用。之所以能够实现条件编译是因为预编译指令是在编译之前进行处理的,通过预编译进行宏替换、条件选择代码段,然后生成最后的待编译代码,最后进行编译。
#if的一般含义是,如果#if后面的常量表达式为true,则编译它所控制的代码,如条件1成立时就编译代码段1,条件1不成立再看条件2是否成立,如果条件2成立则编译代码段2,否则再依次类推判断其它条件,如果条件1-N都不成立则会编译最后的代码段n+1。