C语言基础——结构体

来源:互联网 发布:网络销售门票协议书 编辑:程序博客网 时间:2024/05/24 00:09


1.结构体

        在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄应为整型;性别应为字符型;成绩可为整型或实型。显然不能用一个数组来存放这一组数据。因为数组中各元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型——“结构(structure)”或叫“结构体”。 它相当于其它高级语言中的记录。“结构”是一种构造类型,它是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构既是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义它,也就是构造它。如同在说明和调用函数之前要先定义函数一样。

 

 2.定义和使用结构体变量

        声明一个结构体类型的一般形式为:

Struct 结构体名

     {成员列表};

花括号里是该结构体所以包含的子项,称为结构体的成员,对各成员都应进行类型声明。即

类型名  成员名;

 

        定义一个结构的一般形式为:

 struct 结构名

     {成员表列};

成员表列由若干个成员组成,每个成员都是该结构的一个组成部分。

成员名的命名应符合标识符的书写规定。例如:

struct Student     {         int num;         char name[20];         char sex;         float score; };

        在这个结构定义中,结构名为stu,该结构由4个成员组成。第一个成员为num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应注意在括号后的分号是不可少的。结构定义之后,即可进行变量说明。凡说明为结构Student的变量都由上述4个成员组成。由此可见,结构是一种复杂的数据类型,是数目固定,类型不同的若干有序变量的集合。


定义结构体类型变量

 

1.先声明结构体类型,再定义该类型的变量。

例如,

struct Student   student 1 ,student 2;

这种形式和定义其他类型的变量形式是相似的。在定义了结构体变量之后磨系统会为之分配内存单元。

2.在声明类型的同时定义变量。

例如,

struct Student {    int num;   char name[20];    char sex;    int age;    float score;    char addr[30];  }

        它的作用与第一种方法相同,但是在定义structStudent 类型的同时定义两个struct Student 类型的变量。这种定义方法的一般形式为

  struct 结构体名

  {

     成员列表

}变量名列表;

3.不指定类型名而直接定义结构体类型变量,其一般形式为

struct

  {

     成员列表

}变量名列表;

指定了一个无名的结构体类型。

 

 结构体类型的作用域
 1. 定义在函数外面:全局有效(从定义类型的那行开始,一直到文件结尾)
 2.定义在函数(代码块)内部:局部有效(从定义类型的那行开始,一直到代码块结束)

例如,
// 从这行开始,一直到文件结尾,都是有效(跟全局变量一样)struct Date{    int year;    int month;    int day;};int a;void test2(){    struct Date    {        int year;    };    // 这里使用的是test2函数内部的struct Date类型    struct Date d1 = {2011};            // 结构体类型也是有作用域,从定义类型的那一行开始,一直到代码块结束    struct Person    {        int age;    };        struct Person p;        a  = 10;}int main(){    struct Date d1 = {2009, 8, 9};            test2();        // 不能使用test2函数中定义的类型    // struct Person p2;        return 0;}// 定义结构体变量void test(){    // 定义结构体变量的第3种方式    struct {        int age;        char *name;    } stu;        struct {        int age;        char *name;    } stu2;



 

3.结构体变量的初始化和引用

        在定义结构体变量时,可以对它初始化。例如,

#include <stdio.h>  int main()  {    struct Student    {      long int num;      char name[20];      int age;      char sex;    } a= {10101,”liiming”,10,’M’};printf(“num:%ld,name:%s,age:%d,sex:%c”,a.num,a.name,a.age,a.sex);return 0;

注意;

1.在定义结构体变量是可以对他的成员初始化。

2.可以引用结构体变量中成员的值。

3.如果成员本身又属于一个结构体类型,则要用若干个成员运算符。只能对最低级的成员进行赋值或存取以及计算。

4.对结构体变量的成员可以像普通变量一样进行运算。

5.同类的结构体变量可以相互赋值。

6.可以引用结构体变量成员的地址,也可以引用结构体变量的地址。



4.指向结构体的指针

 1.指向结构体的指针的定义
 struct Student *p;
 
 2.利用指针访问结构体的成员
 1> (*p).成员名称
 2> p->成员名称

#include <stdio.h>int main(){    struct Student    {        int no;        int age;    };    // 结构体变量    struct Student stu = {1, 20};        // 指针变量p将来指向struct Student类型的数据    struct Student *p;        // 指针变量p指向了stu变量    p = &stu;        p->age = 30;        // 第一种方式    printf("age=%d, no=%d\n", stu.age, stu.no);        // 第二种方式    printf("age=%d, no=%d\n", (*p).age, (*p).no);        // 第三种方式    printf("age=%d, no=%d\n", p->age, p->no);    return 0;}


0 0