结构体

为什么需要使用结构体:

在之前学习的数据类型中,有 int(整型),double , float(浮点型),char (字符型)

还有数组,字符串,然而,在定义这些数据时总是互不关联的,例如当我们需要记录学生的姓名,年龄,学号,成绩等时,需要将这些数据联系在一起,此时就需要用到结构体,将各个变量类型指向指向一个整体

一、申明结构体

1.单独定义:

先定义结构,再用结构定义结构变量

//格式

struct node{

        int age,number,score;  // 分别定义结构体中的年龄,学号,成绩

        char name[101];        // 学生的姓名

};  //注意分号,此时也是一条语句

struct node st1;

/*

        struct 结构名 结构变量名

*/

注意 :结构体中可以定义任何数据类型(int double float等),数组类型亦可,此外结构体中还可以再次定义结构体

2.混合定义

同时定义结构和结构变量

struct node{

        int age,number,score;  // 分别定义结构体中的年龄,学号,成绩

        char name[101];        // 学生的姓名

}st1; 

3.无类型名定义

省略结构名,直接定义结构变量

struct {

        int age,number,score;  // 分别定义结构体中的年龄,学号,成绩

        char name[101];        // 学生的姓名

}st1; 

 二、结构变量的初始化和赋值

上述有说,结构体中还可以定义一个新的结构体,不妨将成绩分为语数英三种,定义结构体

struct node2{        //定义成绩的结构体
    int chinese,math,english;
};
struct node {        // 定义学生的结构体

    int number,age;
    char *name;
    char gender[101];
    struct node2 score;
};
int main()
{
    struct node2 score1={120,120,130};  // 定义结构变量并赋值
    struct node st1;   // 定义结构变量
    st1.number=10001; 
    st1.age=18; 
    st1.name='Jack';   // 指针字符串的赋值
    strcpy(st1.gender,"male");   // 字符串的赋值  
    st1.score=score1;        // 正常赋值相同
}

三、结构体的使用 

1.用结构变量操作符,访问结构中的变量

//例如:访问结构变量中的学号,成绩

        st1.number        st1.score

2.结构变量可以作为函数的返回值

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
struct node2{
    int chinese,math,english;
};
struct node {
    int number,age;
    char name[101];
    char gender[101];
    struct node2 score;
};
struct node newstu(char *name,char *gender,int age,struct node2 score2)
{
    struct node st2;
    st2.age=age;
    st2.score=score2;
    strcpy(st2.gender,gender);
    strcpy(st2.name,name);
    return st2;
}
int main()
{
    struct node2 score1;
    struct node st1,st3;
    scanf("%d%d%d",&score1.chinese,&score1.math,&score1.english);  // 输入结构体score
    scanf("%d%d%s%p",&st1.number,&st1.age,st1.name,st1.gender); // 输入结构体st1
    st3=newstu(st1.name,st1.gender,st1.age,score1);   // 将st1的结构体赋值到st3中
    printf("%d %s %d %d %d %s",st3.age,st3.name,st3.score.chinese,st3.score.math,st3.score.english,st1.gender);
    system("pause");
    return 0;
}

四.结构数组

同一结构类型的变量组成的数组本质和其他类型数组相同,只是多了结构)

     struct node a[1001];   // struct 结构名 数组名

 关于结构数组的使用:

访问结构数组的变量        (和结构变量对比)

例如:定义两种类型(结构数组与结构变量)

                              

  struct score {

        int math,chinese,english;
};

struct score student[10];                        struct score student;

student[0].math;                                                student.math;

student[0].chinese;                                            student.chinese;

student[0].english;                                                student.english;

五.结构指针

概念:指向结构类型变量的指针

struct score student;

struct score *sp;

sp=&student;  // sp指向student                struct 结构名 *结构指针变量名

 结构指针间接访问结构变量

①用间接访问符 *(*sp).chinese=100;

②用指针运算符 -> :   sp->chinese=100;

结构指针作为函数参数:传递结构指针可以改变结构中的变量的值

#include<stdlib.h>
#include<malloc.h>
#include<stdio.h>
#include<math.h>
#include<string.h> 
struct node
{
    int chinese,english,math;  //结构内变量名
};
struct node st1;
void change(struct node *st)   // 传递结构指针改变变量
{
    int a=(*st).chinese;
    (*st).chinese=(*st).english;
    (*st).english=(*st).math;
    (*st).math=a;
}
int main()
{
   scanf("%d%d%d",&st1.chinese,&st1.english,&st1.math);
   struct node *sp;
   sp=&st1;
   change(sp);
   printf("%d %d %d",st1.chinese,st1.english,st1.math);
   system("pause");
   return 0;
}

六.其他类型

1.typedef   用于结构

typedef struct score

{

        int math,chinese,english;

}score;                                        // 随后就可以使用 student 作为类型名,声明结构变量

score stu1;          //      注意与 struct score stu1; 的区别

 2.联合 (union) 

用法和 struct 类似 ,区别在于 union 的所有成员共享内存开始地址 (首地址相同)

union 联合名

{

        成员1;

        成员2;

};

 3.枚举 (enum)

enum 枚举名

{                                            

        成员1;  // 一组 int 型常量的集合,成员1默认值为0 之后成员依次累计+1

        成员2;  //  如果某个成员被赋予特定值,则之后的成员从特定值+1

};

关于使用:

enum Day{ Mon,Tue,Wed,Thu,Fri,Sat,Sun};        // 值分别为0 1 2 3 4 5 6

//  enum Day{ Mon=1,Tue,Wed,Thu,Fri,Sat,Sun};   值分别为 1 2 3 4 5 6 7

//  enum Day{ Mon,Tue=2,Wed,Thu,Fri,Sat,Sun};    值分别为 0 2 3 4 5 6 7 

int main()

{

        enum Day day;

        day=Thu; printf("%d",day);  //输出为3

        return 0;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值