【数据类型】C语言,结构体的基本认识

本文深入解析结构体的概念,包括其定义、使用及特性。探讨结构体作为复合数据类型,如何整合不同数据类型创建新类型,以及结构体的定义、变量声明和使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 通过本文,你将学到:
  1. 什么是结构体,结构体的基本特征;
  2. 定义一个结构体;
  3. 申明和使用结构体变量

 

什么是结构体

struct 结构体名字(可有可无)
{
    数据类型
    ……
};
  • 形如上面一样:含有“struct”关键字,含有一对“{ }”,至少含有一个数据类型,和含有一个“;” —— 由这样组成格式,就被称作结构体!
  • 结构体也是一种数据类型,只不过它不同于形如int、char、float等这种基本的数据类型,不同之处在于它可以:
  1. 整合多个同类型的,为一种新类型(当然,这种新类型也是一种数据类型,是你创造的);
  2. 整合多种不同类型的,为一种新的类型;
  3. 总而言之,你可以利用已经存在的数据类型创造新的数据类型!
  • 学习结构体,就像是在学习int一样;只是结构体的定义内容要多一点而已;

结构体的特征

//一个完美的结构体
struct 结构体名
{
    成员1;
    成员2;
    ……
}变量名1,变量名2,……;
  1. 在结构体名与成员列表与变量名列表的三个类别中,至少要出现两个才能是正确的结构体;
  2. 像 int、float、char 等是由C语言本身提供的数据类型,不能再进行分拆,我们称之为基本数据类型;而结构体可以包含多个基本类型的数据,也可以包含其他的结构体,我们将它称为复杂数据类型或构造数据类型。
  3. C语言要求结构体至少得有一个成员,也就是说C语言并不允许空结构体的出现!

 

结构体的两种类型

  1. 标准结构体:
    struct 结构体名 { 
        数据类型…… 
    }结构体变量名;
  2. 匿名结构体:即没有结构体名
    struct { 
        数据类型…… 
    }结构体变量名;

定义结构体(变量)

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

struct stu { //定义一个结构体,这种数据类型是 “struct stu”;
    char *name; //姓名
    int num; //学号
    int age; //年龄
    char group; //所在学习小组
    float score; //成绩
};
  • 既然结构体是一种数据类型,那么就可以用它来定义变量。例如:
struct stu stu1, stu2; //stu1、stu2就是结构体变量;
  • 定义了两个变量 stu1 和 stu2,它们都是 stu 类型,都由 5 个成员组成。注意关键字struct不能少。
  • stu 就像一个“模具”,定义出来的变量都具有相同的性质。

2、定义结构体的同时就定义变量

struct{  //没有写 stu,后面就没法用该结构体定义新的变量。
    char *name; //姓名,结构体成员变量
    int num; //学号
    int age; //年龄
    char group; //所在学习小组
    float score; //成绩
} stu1, stu2; //在定义时就初始化两个结构体变量;

3、直接定义结构体类型变量,省略类型名

struct {
	char *name;
	int age;
} stu;

 

结构体变量

把结构体变量想象成int型变量或者是其他基础类型的变量即可。

struct 结构体名 结构体变量名;  ===>>>   int int型变量名;

结构体变量的引用四种方式:

1) 结构体变量名.成员名:stu1.name

2) 结构体指针变量成员名:ps->name

3) (*结构体指针变量).成员名:(*ps).name 因为优先级的问题,所以要加括号

4) 结构体变量数组名.成员名:stu[0].name

//示例
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
struct MyStruct
{
	char* name;
	int age;
};
int main()
{
	struct MyStruct person_a; //结构体变量,类比于:int a;
	person_a.name = "aaa";
	person_a.age = 10;
	printf("%s,%d\n", person_a.name, person_a.age);

	struct MyStruct* person_b = NULL; //结构体指针,类比于:int *a;
	person_b = (struct MyStruct*)malloc(sizeof(struct MyStruct) * 1);
	person_b->name = "bbb";
	person_b->age = 20;
	printf("%s,%d\n", person_b->name, person_b->age);
	printf("%s,%d\n", (*person_b).name, (*person_b).age);

	struct MyStruct persons[5]; //结构体数组,类比于:int a[5];
	int i;
	for (i = 0; i < 5; i++)
	{
		persons[i].name = "x";
		persons[i].age = 0;
	}
	printf("%s,%d\n", persons[0].name, persons[0].age);

	return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值