前面我们都是讲的简单数据类型,定义一个类型变量,这个变量不论是数组还是指针,还是基本数据类型,它只有一种类型,是INT就是INT,如果一个数据结构中需要多种类型,如描述一个学生的属性,如学号用INT,姓名用CHAR数组,性别是CHAR,年龄是int,成绩是double,地址是char数组。如下表示:

C语言基本概念(6)_姓名

结构体就是将不同的数据类型组合成一个有机整体,以便于引用。声明一个结构体与定义一个结构变量是两回事,通常声明一个结构体如下:

struct student

{

  int num;

  char name[20];

  char sex;

   int age;

   double score;

   char  addr[30];

};

定义结构体类型变量:

【1】先声明再定义变量名 struct student student1, student2;

【2】声明类型同时定义变量

C语言基本概念(6)_姓名_02

【3】不同结构名称,定义变量

从上面可以看出来,结构名称通常只是一种类型名称,内存是不分配实际内容空间的。只有结构变量才会根据结构体内容结合编译器的编译优化原则进行内存分配。

定义了结构体变量后,对结构体变量赋值需要单独逐个赋值,不能一次性赋值,也可以在声明时进行初始化赋值。但不同用scanf一次性赋值。两个相同的结构的变量可以相互赋值。如student1 = student2

C语言基本概念(6)_border_03

结构体作为一个复合数据类型,因此,可以把结构体当成一个新类型来使用,就是使用typedef一样,可以定义数组、指针以及前面的所看到的结构体内含结构体。

C语言基本概念(6)_target_04

数组也可以初始化,可以直接跟在数组变量后初始化也可以单独定义中进行初始化。其形式同普通数组初始化完全一样。声明结构体指针同普通指针变量一样,如struct student *pstu;因为指针是未分配内存的,需要分配内存或者将指针指向一个已经存储的指针变量,如前面boy1,可以pstru = &boy1.通过指针取结构成员使用pstu->符号。

C语言基本概念(6)_border_05

从将结构体看成一个自定义的数据类型的角度来看,结构体变量当然可以作为函数的形参与实参,同样,结构体指针变量也一样。通常将一个结构体变量的值传递到另一个函数中,有以下三种方法:

【1】结构体变量的成员作为参数

【2】结构体变量作为实参

【3】指向结构体变量(或数组)的指针作为实参,将地址传给形参。

C语言基本概念(6)_姓名_06