C基础9--结构体

1.结构体定义:

<1> 结构体是一种构造数据类型
<2> 把不同类型的数据组合成一个整体

结构体的定义形式:

struct  结构体名{
     结构体所包含的变量或数组
};

下面是struct 关键字在词典中的解释:

struct	
[词典]	结构; 结构体; 结构体类型;
[例句]The struct keyword provides a way to collect a group of variables  
	  together into a structure
[翻译]struct关键字提供了将一组变量集中到一个结构的方法。

结构体是一种集合,它里面包含了很多变量或(和)数组,它们的类型可以相同,也可以不相同。
每个这样的变量或数组都称为结构体的成员(Member)。请看下面的一个例子:

struct stu{
    char name[];  //姓名
    int num;  //工号
    int age;  //年龄
    char group;  //所在单位
};

1. 注意:大括号后面的分号;不能少,这是一条完整的语句。
2. stu 为结构体名,它包含了 4 个成员,分别是 name、num、age、group。结构体成员的定义方式与变量和
   数组的定义方式相同,只是不能初始化。
3. 结构体也是一种数据类型,(构造类型)它由程序员自己定义,可以包含多个其他类型的数据。
 
   /*像 int、float、char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;
   而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,
   我们将它称为复杂数据类型或构造数据类型。*/

2.结构体变量:

2.1 先定义结构体类型,再定义结构体变量

struct student {
    char name[];  //姓名
    int num;  //工号
    int age;  //年龄
    char group;  //所在单位
}; // 先定义结构体


 struct student stu1,stu2; //再进行定义

2.2 定义结构体类型的同时定义结构体变量

struct student {
    char name[];  //姓名
    int num;  //工号
    int age;  //年龄
    char group;  //所在单位
} stu1,stu2;     // 定义结构体的同时,定义结构体变量。

//这样我后续可以 这样操作!

 struct student stu3,stu4;   //手动滑稽!!

2.3 直接定义结构体变量

struct  {
    char name[];  //姓名
    int num;  //工号
    int age;  //年龄
    char group;  //所在单位
} stu1,stu2;        //直接定义结构体变量。

3.结构体变量初始化

3.1 在定义结构体变量的时候直接赋值

  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 int main(int argc, const char *argv[])
  5 {
  6 
  7     struct student{
  8         char name[20];
  9         int num;
 10         int age;
 11         char group[20];
 12     }stu1={"chenxu",1634130119,23,"beijing_lthy"};
 13 
 14     printf("nihao \n");
 15     printf("%s,%d,%d,%s\n",stu1.name,stu1.num,stu1.age,stu1.group);
 16     printf("name=%s\nnum=%d\nage=%d\ngroup=%s\n",stu1.name,stu1.num,stu1.age,stu1.group);
 17     return 0;
 18 }  

3.2 在定义结构体变量后逐个赋值

  1 #include <stdio.h>
  2 #include <string.h>
  3 
  4 int main(int argc, const char *argv[])
  5 {
  6 
  7     struct {
  8         char *name;
  9         int  num;
 10         int  age;
 11         char *group;
 12     }stu2;
 13 
 14 #if 0   
 15     stu1={"chenxu",1634130119,23,"beijing_lthy"},stu2;
 16     printf("%s,%d,%d,%s\n",stu1.name,stu1.num,stu1.age,stu1.group);
 17     printf("name=%s\nnum=%d\nage=%d\ngroup=%s\n",stu1.name,stu1.num,stu1.age,stu1.group);
 18 
 19 #endif 
 20 
 21 #if 1
 22     stu2.name="chenxu";
 23     stu2.num=1634130119;
 24     stu2.age=24;
 25     stu2.group="beijing_lthy";
 26     printf("name=%s\nnum=%d\nage=%d\ngroup=%s\n",stu2.name,stu2.num,stu2.age,stu2.group);
 27 #endif
 28     
 29     return 0;
 30 
 31 }

4.结构体数组

4.1 结构体数组定义

结构体数组,是指数组中的每个元素都是一个结构体。
在实际应用中,结构体数组常被用来表示一个拥有相同数据结构的群体,
比如一个班的学生,他们拥有相同的信息,姓名,年龄,学号,成绩,性别等
再比如超市的商品,他们拥有类似的产品名,出厂日期,保质期,等等。
定义结构体数组和定义结构体变量的方式类似,请看下面的例子:

  1 truct stu{
  2     char *name;  //姓名
  3     int num;     //学号
  4     int age;     //年龄
  5     char group;  //所在小组 
  6     float score;  //成绩
  7 }class[50];   

4.2 结构体数组初始化

struct stu{
    char *name;  //姓名
    int num;  //学号
    int age;  //年龄
    char group;  //所在小组 
    float score;  //成绩
}class[5] = {
    {"Li ping", 5, 18, 'C', 145.0},
    {"Zhang ping", 4, 19, 'A', 130.5},
    {"He fang", 1, 18, 'A', 148.5},
    {"Cheng ling", 2, 17, 'F', 139.0},
    {"Wang ming", 3, 17, 'B', 144.5}
};

struct stu{
    char *name;  //姓名
    int num;  //学号
    int age;  //年龄
    char group;  //所在小组 
    float score;  //成绩
}class[] = {
    {"Li ping", 5, 18, 'C', 145.0},
    {"Zhang ping", 4, 19, 'A', 130.5},
    {"He fang", 1, 18, 'A', 148.5},
    {"Cheng ling", 2, 17, 'F', 139.0},
    {"Wang ming", 3, 17, 'B', 144.5}
};

4.3 结构体数组的使用

结构体数组的使用也很简单。例如,计算全班学生的总成绩、平均成绩和140分一下的人数:

#include <stdio.h>
 
struct{
    char *name;  //姓名
    int num;  //学号
    int age;  //年龄
    char group;  //所在小组
    float score;  //成绩
}class[] = {
    {"Li ping", 5, 18, 'C', 145.0},
    {"Zhang ping", 4, 19, 'A', 130.5},
    {"He fang", 1, 18, 'A', 148.5},
    {"Cheng ling", 2, 17, 'F', 139.0},
    {"Wang ming", 3, 17, 'B', 144.5}
};
 
int main(){
    int i, num_140 = 0;
    float sum = 0;
    for(i=0; i<5; i++){
        sum += class[i].score;
        if(class[i].score < 140) num_140++;
    }
    printf("sum=%.2f\naverage=%.2f\nnum_140=%d\n", sum, sum/5, num_140);
    return 0;
}

5.结构体作为函数参数

可以把结构作为函数的参数进行传参,传参方式与其他类型的变量或指针相似。如下面的例子:

  1 #include <stdio.h>
  2 #include<string.h>
  3 
  4 struct Books
  5 {
  6     char title[50];
  7     char author[50];
  8     char subject[100];
  9     int book_id;
 10 };  
 11  
 12 void printfbook (struct Books book);//函数声明
 13  
 14 int main()
 15 {
 16     struct Books Book1;    //声明Book1k1,类型为Books
 17     strcpy(Book1.title, "C Programming");
 18     strcpy(Book1.author, "Nuha Ali");
 19     strcpy(Book1.subject, "C Programming Tutorial");
 20     Book1.book_id = 6495407;
 21 
 22     printfbook (Book1);
 23     return 0;
 24 }                                                                           
 25 
 26 
 27 void printfbook(struct Books book)
 28 {
 29     printf("Book title:%s\n", book.title);
 30     printf("Book author:%s\n", book.author);
 31     printf("Book subject:%s\n", book.subject);
 32     printf("Book book_id:%d\n", book.book_id);
 33 }      

6.结构体指针

本文在原文的基础上做了一些优化,目前这里是借鉴的一篇 柚子 的文章:
原文链接:https://blog.csdn.net/qq_44358197/article/details/90812372

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值