C语言之结构体

结构体

为什么需要结构体

  为了表示一些复杂的事物,而普通的基本类型无法满足实际要求

什么叫结构体

  把一些基本类型数据组合在一起形成的一个新的数据类型,这叫做结构体

如何定义结构体

3种方式,推荐第一种

# include <stdio.h>

//第一种方式
struct Student 
{
    int age;
    float score;
    char sex;
};

//第二种方式
struct Student2 
{
    int age;
    float score;
    char sex;
}st2;

//第三种方式
struct
{
    int age;
    float score;
    char sex;
}st3;

int main(void) 
{
    /*
        int age;
        float score;
        char name[100];
    */

    struct Student st = {80,78.5,'F'};

    return 0;
}

怎么使用结构体变量

赋值和初始化

定义的同时可以整体赋初值

如果定义完之后,则只能单个的赋初值

# include <stdio.h>

struct Student 
{
    int age;
    float score;
    char sex;
};

int main(void) 
{
    struct Student st = { 80,66.6,'F' }; //初始化 定义同时赋初值
    struct Student st2;
    st2.age = 10;
    st2.score = 88.5;
    st2.sex = 'F';

    printf("%d %f %c\n", st.age, st.score, st.sex);
    printf("%d %f %c\n", st2.age, st2.score, st2.sex);

    return 0;
}

如何取出结构体变量中的每一个成员

1.结构体变量名.成员名

2.指针变量名->成员名

  指针变量名->成员名 在计算机内部会被转换成(*指针变量名).成员名的方式来执行

  所以说这两种方式是等价的

# include <stdio.h>

struct Student 
{
    int age;
    float score;
    char sex;
};

int main(void) 
{
    struct Student st = { 80,66.6,'F' };

    struct Student* pst=&st; //&st不能改成st

    st.score = 65.5f; //第一种方式
    pst->age = 88; //第二种方式

    printf("%d %f\n", st.age, pst->score);

    return 0;
    //pst->age 在计算机内部会被转换成(*pst).age,这就是->的含义
}

1.pst->age 在计算机内部会被转换成(*pst).age,这就是->的含义,这也是一种硬性规定

2.所以pst->age等价于(*pst).age 也等价与 st.age

3.我们之所以知道pst->age等价于st.age,是因为pst->age是被转换成了(*pst).age来执行

4.pst->age的含义:pst所指向的那个结构体变量中的age这个成员

结构体变量的运算

结构体变量不能相加,不能相减,也不能相互乘除

但结构体变量可以相互复制

例子

struct Student 
{
    int age;
    char sex;
    char name[100];
};
 struct Student st1,st2;
st1+st2; st1-st2; st1*st2; st1/st2; 都是错误的
st1=st2; st2=st1; 都是正确的

结构体变量和结构体变量指针作为函数参数传递的问题

推荐使用结构体指针变量作为函数参数来传递

# include <stdio.h>
# include <string.h>


void InputStudent(struct Student*);
void OutputStudent(struct Student);

struct Student 
{
    int age;
    char sex;
    char name[100];
};

int main(void) 
{
    struct Student st;
    InputStudent(&st); //对结构体变量输入 必须发送st的地址
    OutputStudent(st); //对结构体变量输出 可以发送st的地址也可以直接发送st的内容  

    return 0;
}

void InputStudent(struct Student *pstu) //pstu只占4个字节

{
    (*pstu).age = 10;
    strcpy_s(pstu->name,"张三"); //不能写成stu.name="张三";
    pstu->sex = 'F';
}

void OutputStudent(struct Student st) 
{
    printf("%d %c %s\n", st.age, st.sex, st.name);
}
/*
//本函数不能修改主函数的值
void InputStudent(struct Student stu) 
{
    stu.age = 10;
    strcpy(stu.name,"张三"); //不能写成stu.name="张三";
    stu.sex = 'F';
}
*/

冒泡排序

#include <stdio.h>

void sort(int * pArr,int len) 
{
    for (int i = 0;i < len-1;i++) 
    {
        for (int j = 0;j < len - 1-i;j++) 
        {
            int temp = 0;
            if (*(pArr + j) > *(pArr + j + 1)) 
            {
                temp = *(pArr + j);
                *(pArr + j) = *(pArr + j + 1);
                *(pArr + j + 1) = temp;
            }
        }
    }
}

int main(void) 
{
    int a[6] = { 10,2,8,-8,11,0 };
    int i = 0;

    sort(a,6);

    for (i = 0;i < 6;i++) 
    {
        printf("%d\t", a[i]);
    }
    printf("\n");

    return 0;
}

举例:动态构造存放学生信息的结构体数组

动态构造一个数组,存放学生的信息

然后按分数排序输出

 1 #define  _CRT_SECURE_NO_WARNINGS 1
 2 # include <stdio.h>
 3 # include <malloc.h>
 4 
 5 
 6 
 7 struct Student 
 8 {
 9     int age;
10     float score;
11     char name[100];
12 };
13 
14 void InputStudent(struct Student *,int len);
15 void OutputStudent(struct Student *, int len);
16 void sort(struct Student*,int len);
17 
18 int main(void) 
19 {
20     int len;
21 
22     struct Student * pArr;
23 
24     printf("请输入学生的个数:\n");
25     printf("len=");
26     scanf("%d", &len);
27 
28     //动态构造一维数组
29     pArr = (struct Student*)malloc(len * sizeof(struct Student));
30 
31     //输入学生信息
32     InputStudent(pArr, len);
33 
34     printf("\n\n学生的信息是:\n\n");
35     //输出学生信息
36     OutputStudent(pArr, len);
37     //成绩排序
38     printf("\n\n学生的成绩排序结果是:\n\n");
39     sort(pArr, len);
40 
41     return 0;
42 }
43 
44 void InputStudent(struct Student* pstu,int len) 
45 {
46     for (int i = 0;i < len;i++)
47     {
48         printf("请输入第%d个学生的信息\n", i + 1);
49         printf("age = ");
50         scanf("%d", &pstu[i].age);
51         printf("name = ");
52         scanf("%s", pstu[i].name); // name是数组名,本身就已经是数组首元素的地址,所以pArr[i].name不能写成&pArr[i].name
53         printf("score= ");
54         scanf("%f", &pstu[i].score);
55     }
56 }
57 
58 void OutputStudent(struct Student* pstu, int len)
59 {
60     for (int i = 0;i < len;i++)
61     {
62         printf("第%d个学生的信息\n", i + 1);
63         printf("age = %d\t", pstu[i].age);
64         printf("name = %s\t", pstu[i].name);
65         printf("score = %f\t", pstu[i].score);
66         printf("\n");
67     }
68 }
69 
70 void sort(struct Student* pstu, int len) 
71 {
72     for (int i = 0;i < len - 1;i++) 
73     {
74         for (int j = 0;j < len - 1 - i;j++) 
75         {
76             float temp = 0;
77             if (pstu[j].score > pstu[j + 1].score) 
78             {
79                 temp = pstu[j].score;
80                 pstu[j].score = pstu[j + 1].score;
81                 pstu[j + 1].score = temp;
82             }
83         }
84     }
85 
86     //成绩排序结果
87     for (int i = 0;i < len;i++) 
88     {
89         printf("%f\t", pstu[i].score);
90     }
91 }
posted @ 2024-05-08 15:25  万溪汇海  阅读(9)  评论(0编辑  收藏  举报