C语言结构体的定义与使用

这篇具有很好参考价值的文章主要介绍了C语言结构体的定义与使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C语言结构体的定义与使用

参考:C语言指针

1.定义与使用

结构体是一种构造数据类型,把不同类型的数据组合成一个整体
结构体的定义形式:

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

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

struct stu{
    char name[];  //姓名
    int num;  //学号
    int age;  //年龄
    char group;  //所在学习小组
    float score;  //成绩
};

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

类型:
(1)先定义结构体类型,再定义结构体变量

 struct   student 
{       
 int num;
 char  name[20];
 char sex;
 int age; 
 float score;
 char addr[30];
 };
 struct student stu1,stu2;         

(2)定义结构体类型的同时定义结构体变量

 struct   data
 {      
  int day int month;
  int year
 }time1,time2; 

(3)直接定义结构体变量

 struct 
{
 char name[20];
 char sex; 
 int num; 
 float score[3]
 }person1,person2; 

2.结构体变量的初始化

和其它类型变量一样,对结构体变量可以在定义时指定初始值。

#include <stdio.h>
 
struct Books
{
   char  title[50];
   char  author[50];
   char  subject[100];
   int   book_id;
} book = {"C 语言", "RUNOOB", "编程语言", 123456};
 
int main()
{
    printf("title : %s\nauthor: %s\nsubject: %s\nbook_id: %d\n", book.title, book.author, book.subject, book.book_id);
}

输出结果:

title : C 语言
author: RUNOOB
subject: 编程语言
book_id: 123456

3.访问结构成员

为了访问结构的成员,我们使用成员访问运算符(.)。
引用形式:<结构体类型变量名>.<成员名>
注意:结构体变量不能整体引用,只能引用变量成员
  成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。可以使用 struct 关键字来定义结构类型的变量。下面的实例演示了结构的用法:

#include <stdio.h>
int main(){
    struct{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    } stu1;
 
    //给结构体成员赋值
    stu1.name = "Tom";
    stu1.num = 12;
    stu1.age = 18;
    stu1.group = 'A';
    stu1.score = 136.5;
 
    //读取结构体成员的值
    printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
 
    return 0;
}

运行结果:
Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!

除了可以对成员进行逐一赋值,也可以在定义时整体赋值,例如:

struct{
    char *name;  //姓名
    int num;  //学号
    int age;  //年龄
    char group;  //所在小组
    float score;  //成绩
} stu1, stu2 = { "Tom", 12, 18, 'A', 136.5 };

  不过整体赋值仅限于定义结构体变量的时候,在使用过程中只能对成员逐一赋值,这和数组的赋值非常类似。
  需要注意的是,结构体是一种自定义的数据类型,是创建变量的模板,不占用内存空间;结构体变量才包含了实实在在的数据,需要内存空间来存储。

4.结构作为函数参数

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

#include <stdio.h>
#include<string.h>
 
struct Books
{
	char title[50];
	char author[50];
	char subject[100];
	int book_id;
};
 
void printBook(struct Books book);//函数声明
 
int main()
{
	struct Books Book1;//声明Book1,类型为Books
	struct Books Book2;
 
	/* Book1 详述 */
	strcpy(Book1.title, "C Programming");
	strcpy(Book1.author, "Nuha Ali");
	strcpy(Book1.subject, "C Programming Tutorial");
	Book1.book_id = 6495407;
	printBook(Book1);
	return 0;
}
void printBook(struct Books book)
{
	printf("Book title:%s\n", book.title);
	printf("Book author:%s\n", book.author);
	printf("Book subject:%s\n", book.subject);
	printf("Book book_id:%d\n", book.book_id);
}
运行结果:

Book title:C Programming
Book author:Nuha Ali
Book subject:C Programming Tutorial
Book book_id:6495407

5.结构体数组

  所谓结构体数组,是指数组中的每个元素都是一个结构体。在实际应用中,结构体数组常被用来表示一个拥有相同数据结构的群体,比如一个班的学生、一个车间的职工等。
定义结构体数组和定义结构体变量的方式类似,请看下面的例子:

struct stu{
    char *name;  //姓名
    int num;  //学号
    int age;  //年龄
    char group;  //所在小组 
    float score;  //成绩
}class[5];
//表示一个班有5个人

结构体数组在定义的同时也可以初始化,例如:

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}
};

结构体数组的使用也很简单。例如,计算全班学生的总成绩、平均成绩和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;
}

运行结果:

sum=707.50
average=141.50
num_140=2

6.指向结构的指针

可以定义指向结构的指针,方式与定义指向奇特类型变量的指针类似,
定义形式:struct 结构体名 *结构体指针名;

struct Books *struct_pointer;

定义之后可以在上述定义的指针变量中存储结构变量的地址。例:

struct_pointer = &Book1;

为了使用指向该结构的指针访问结构的成员,必须使用->运算符,如下所示:

struct_pointer->title;

定义结构体指针的实例:

struct stu{
    char *name;  //姓名
    int num;  //学号
    int age;  //年龄
    char group;  //所在小组
    float score;  //成绩
} stu1 = { "Tom", 12, 18, 'A', 136.5 };
//结构体指针

struct stu *pstu = &stu1;

也可以在定义结构体的同时定义结构体指针:

struct stu{
    char *name;  //姓名
    int num;  //学号
    int age;  //年龄
    char group;  //所在小组
    float score;  //成绩
} stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;

注意:结构体变量名和数组名不同,数组名在表达式中会被转换为数组指针,而结构体变量名不会,无论在任何表达式中它表示的都是整个集合本身,要想取得结构体变量的地址,必须在前面加&符号,所以给p赋值只能写成

struct stu *p=&stu1;

而不能写成:

struct stu *p=stu1;

注意:结构体和结构体变量是两个不同的概念:结构体是一种数据类型,是一种创建变量的模板,编译器不会为它分配内存空间,就像 int、float、char 这些关键字本身不占用内存一样;结构体变量才包含实实在在的数据,才需要内存来存储。下面的写法是错误的,不可能去取一个结构体名的地址,也不能将它赋值给其他变量:

struct stu *pstu = &stu;
struct stu *p=stu;

7.获取结构体成员

通过结构体指针可以获取结构体成员,一般形式为:

(*pointer).memberName

或者:

pointer->memberName

  第一种写法中,.的优先级高于*,(pointer)两边的括号不能少,如果去掉括号写成pointer.memberName,那么就等效于*(pointer.memberName),这样意义就不对了。
  第二种写法中,->是一个新的运算符,习惯称它为“箭头”,有了它,可以通过结构体指针直接取得结构体成员,这也是->在C语言中的唯一用途。
上面两种写法是等效的,我们通常采用第二种写法,这样更加直观。

实例:结构体指针的使用

#include <stdio.h>
int main(){
    struct{
        char *name;  //姓名
        int num;  //学号
        int age;  //年龄
        char group;  //所在小组
        float score;  //成绩
    } stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;
 
    //读取结构体成员的值
    printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", (*pstu).name, (*pstu).num, (*pstu).age, (*pstu).group, (*pstu).score);
    printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", pstu->name, pstu->num, pstu->age, pstu->group, pstu->score);
 
    return 0;
}

运行结果:

Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!
Tom的学号是12,年龄是18,在A组,今年的成绩是136.5!

示例:结构体数组指针的使用

#include <stdio.h> 
struct stu{
    char *name;  //姓名
    int num;  //学号
    int age;  //年龄
    char group;  //所在小组
    float score;  //成绩
}stus[] = {
    {"Zhou ping", 5, 18, 'C', 145.0},
    {"Zhang ping", 4, 19, 'A', 130.5},
    {"Liu fang", 1, 18, 'A', 148.5},
    {"Cheng ling", 2, 17, 'F', 139.0},
    {"Wang ming", 3, 17, 'B', 144.5}
}, *ps;
 
int main(){
    //求数组长度
    int len = sizeof(stus) / sizeof(struct stu);
    printf("Name\t\tNum\tAge\tGroup\tScore\t\n");
    for(ps=stus; ps<stus+len; ps++){
        printf("%s\t%d\t%d\t%c\t%.1f\n", ps->name, ps->num, ps->age, ps->group, ps->score);
    }
 
    return 0;
}

运行结果:

Name Num Age Group Score
Zhou ping 5 18 C 145.0
Zhang ping 4 19 A 130.5
Liu fang 1 18 A 148.5
Cheng ling 2 17 F 139.0
Wang ming 3 17 B 144.5

8.嵌套结构体

  结构体不仅可以单独使用,也可以在结构体中嵌套另一个结构体。如下面的例子:

struct Date{
		int year;
		int month;
		int day;
	};

	struct book
	{
		char title[30];
		char author[30];
		float value;
		struct Date date;
	};

  首先声明一个book结构体,在这个结构体里面描述了书本的标题、作者、价格、出版日期。由于出版日期里面有包含了年月日信息,为了方便管理,就将出版日期也单独定义为一个结构体。这样就相当于在book结构体里面又嵌套了一个日期的结构体。
初始化方法如下:

struct book books[3]= {
							{"语文","张三",19.8,{2021,10,1}},
							{"数学","李四",21.3,{2021,10,2}},
							{"英语","王五",16.8,{2021,10,3}}
						  };

  在这里定义了一个结构体数组,每一个数组元素表示一本书的信息。在初始化的时候,书本的标题、作者、价格按照顺序依次写入,每一项之间用逗号隔开。接下来初始化日期,由于日期也是一个结构体,所以需要用大括号{ }将它括起来,然后在这个大括号里面依次填入日期信息,每一项之间用逗号隔开。初始化的时候也是将两个结构体嵌套起来。
  如果需要访问书本的日期时,就需要用两次点,来定位到具体位置上。比如要访问数学书年的信息,可以使用下面的方法。文章来源地址https://www.toymoban.com/news/detail-446389.html

books[1].date.year

到了这里,关于C语言结构体的定义与使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言第十四课-------结构体的认识和使用-------重要一笔

    🎂        ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂    🎂      作者介绍:                              🎂🎂        🎂 🎉🎉🎉🎉🎉🎉🎉              🎂           🎂作者id:老秦包你会,         🎂 简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂

    2024年02月14日
    浏览(45)
  • 结构体和数据结构--从基本数据类型到抽象数据类型、结构体的定义

            在冯-诺依曼体系结构中,程序代码和数据都是以二进制存储的,因此对计算机系统和硬件本身而言,数据类型的概念其实是不存在的。         在高级语言中,为了有效的组织数据,规范数据的使用,提高程序的可读性,方便用户使用,引入了整型、实型等基本数

    2024年02月11日
    浏览(48)
  • 结构体的三种定义方法、结构体类型名(可选标志符)什么时候可以省略

    一、单独定义:   先定义结构体类型,再定义变量   定义结构体的格式如下:    struct 结构体名 {    若干数据项;    } ;   其中,struct为; 结构体名是用户定义的类型标识。 { }中是组成该结构体的成员。成员的数据类型可以是C语言所允许的任何数据

    2024年02月05日
    浏览(51)
  • C语言如何计算结构体大小(结构体的内存对齐)

    结构体的内存对齐是有关结构体内容的很重要一个知识点,主要考察方式是计算结构体的字节大小。 当我们对计算结构体一无所知,我们不妨自己思索如何计算,是不是直接计算结构体成员变量占用内存的大小呢? 那我们先举个例子  观察发现结构体的大小计算跟我们想的

    2024年02月16日
    浏览(46)
  • C语言结构体的初始化方式

    逐个初始化字段 :这是最直接的方式,你可以逐个为结构体的每个字段进行初始化。 2.使用结构体字面值初始化 :这种方式允许你在初始化时使用一个字面值来为结构体提供初始值 3. 全局初始化 :在全局范围内,你可以在变量声明时就进行初始化。 4. 使用  memset  函数 :

    2024年02月09日
    浏览(57)
  • C语言笔记——结构体的三种打印方法

    (看鹏哥C语言视频学的,自己做的笔记) 首先定义一个结构体(以学生的信息为例): 第一种 打印方法: 注意:age要对应%d,其余都是%s,其余三个顺序换了无所谓。 运行结果:   第二种 打印方法(函数+地址): 第三种 打印方法(与第二种方法类似,用箭头表示而已)

    2024年02月02日
    浏览(50)
  • 【C语言】什么是结构体内存对齐?结构体的大小怎么计算?

      目录 1.结构体内存对齐 对偏移量的理解:​ 2.结构体的大小计算 2.1结构体中只有普通的数据类型的大小计算 2.2 结构体中有嵌套的结构体的大小计算 3.修改默认对齐数 4.为什么存在内存对齐? 这篇文章主要介绍结构体内存对齐和如何计算大小。 在学习结构体内存对齐之前,

    2024年02月11日
    浏览(52)
  • 【c语言】——结构体千字解读,看完你肯定不会有任何结构体的疑惑

    在学习初期,我们接触了很多整型,浮点型,字符型等变量,其实结构体从整体上看和他们都 差不多 其实现阶段对结构体有疑惑的无疑是 1.用的少,老是忘记怎么用  2.对结构体的知识点不是很牢,经常弄混 第一点只能自己找题目练习,第二点不用担心,看完就可以豁然开

    2024年03月10日
    浏览(30)
  • 【初始C语言8】详细讲解初阶结构体的知识

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖         在上一章中,我们浅浅地学习了初阶指针的相

    2024年02月08日
    浏览(42)
  • Go语言结构体struct详解,Go空结构体的这些妙用你知道吗?

    本文详解了Go语言结构体的各个知识点,最后介绍了空结构体的3种妙用。希望对你有帮助。 结构体,是一种自定义的数据类型,由多个数据类型组合而成。用于描述一类事物相关属性 。 定义方式 : 结构体和结构体指针,两者的实例化有所区别 提供多种写法,灵活使用:

    2024年02月01日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包