Linux-C P10 结构体细讲

本文详细讲解了C语言中的结构体,包括结构体的基础定义、声明、初始化及使用,结构体数组和结构体指针的概念与应用。通过实例演示了如何在程序中灵活运用结构体,以解决复杂数据组织问题。

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

Linux-C P10 结构体细讲

在这里插入图片描述
关于结构体,在数据类型(Linux-C P2 数据类型)里已经做了简要的讲解
但对于后面的内容,结构体是一个很重要的数据类型
因此本文会对其进行详细的讲解,包括结构体的基础结构体数组结构体指针

结构体基础

在这里插入图片描述

结构体定义

对于数组,它是能够存储若干相同数据类型的结构,但是如果有许多信息且不是同一数据的类型需要组合成一个整体来进行描述,那么数组就没有办法
所以结构体由此诞生了,结构体的使用为处理复杂的数据结构提供了有效的手段,为函数间传递不同类型的数据提供了方便

一般形式

struct 结构体名
{
    数据类型    成员名1;
    数据类型    成员名2;
    ...
    数据类型    成员名n;
}

例如你要定义一只羊的信息

struct Yang
{
    char    name[20];
    int      age;
    char    sex;
    int      weight;
    ...
}

结构体类型的特点

1.结构体类型是用户自行构造的
2.它由若干不同的基本数据类型的数据构成
3.它属于C语言的一种数据类型,与整型、浮点型相当,所以只有用它定义变量时才分配空间

结构体声明

定义完结构体之后,就需要来声明结构体了,关于结构体的声明有几种方法,下面一一列举

方法一

先声明结构体类型再定义变量名

struct 结构体名
{
    数据类型    成员名1;
    数据类型    成员名2;
    ...
    数据类型    成员名n;
}
struct 结构体名 变量名1

同样以羊为例

struct Yang
{
    char    name[20];
    int      age;
    char    sex;
    int      weight;
    ...
}
struct Yang yang1;

方法二

在声明类型的同时定义变量

struct 结构体名
{
    数据类型    成员名1;
    数据类型    成员名2;
    ...
    数据类型    成员名n;
}变量名1,变量名2....

同样以羊为例

struct Yang
{
    char    name[20];
    int      age;
    char    sex;
    int      weight;
    ...
}yang1,yang2;

方法三

直接定义结构类型变量

struct 
{
    数据类型    成员名1;
    数据类型    成员名2;
    ...
    数据类型    成员名n;
}变量名1,变量名2....

同样以羊为例

struct 
{
    char    name[20];
    int      age;
    char    sex;
    int      weight;
    ...
}yang1,yang2;

这里不需要定义结构体名,而是直接定义了变量名


对于前面两种情况方法三的定义是最简单的,但是要在后面再定义机构体变量是需要结构体名的,因此需要用到方法一和方法二来声明与定义

结构体初始化

对于结构体的初始化,可以这样进行赋值

一般形式

变量名.成员名 = 变量值;

关于具体的初始化,有两种方法


方法一

直接进行逐一赋值

struct 结构体名
{
    数据类型    成员名1;
    数据类型    成员名2;
    ...
    数据类型    成员名n;
}
struct 结构体名 变量名1;

变量名1.成员名1 = 变量值1;
变量名1.成员名2 = 变量值2;
...
变量名1.成员名3 = 变量值3;

方法二

声明与定义时直接对变量名进行赋值

可以在单独定义变量的时候初始化

struct 结构体名
{
    数据类型    成员名1;
    数据类型    成员名2;
    ...
    数据类型    成员名n;
}
struct 结构体名 变量名1={变量值1,变量值2....变量值n};

也可以在声明变量的时候定义变量的时候初始化

struct 结构体名
{
    数据类型    成员名1;
    数据类型    成员名2;
    ...
    数据类型    成员名n;
}变量名1={变量值1,变量值2....变量值n};

结构体使用

针对结构体的定义、声明和初始化已经做了详细的讲解,接下来就来耍耍它吧!

举个栗子

这里做一个简单的结构体定义、声明、初始化并打印出信息的栗子

在这里插入图片描述

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

int main(int argc, const char *argv[])
{
	struct Yang
	{
		char name[20];
		int age;
		char sex;
		int weight;
	}yang1,yang2={"hhhh",5,'m',15};

	struct Yang yang3={"wwww",3,'f',12};

	strcpy(yang1.name,"ffff");
	yang1.age = 6;
	yang1.sex = 'm';
	yang1.weight = 20;

	printf("yang1.name = %s,yang1.age = %d,yang1.sex = %c,yang1.weight = %d\n",
			yang1.name,yang1.age,yang1.sex,yang1.weight);

	printf("yang2.name = %s,yang2.age = %d,yang2.sex = %c,yang2.weight = %d\n",
			yang2.name,yang2.age,yang2.sex,yang2.weight);

	printf("yang3.name = %s,yang3.age = %d,yang3.sex = %c,yang3.weight = %d\n",
			yang3.name,yang3.age,yang3.sex,yang3.weight);


	return 0;
}

在这里插入图片描述

这里进行了简单的演示,现在给这个栗子加点料,在结构体中定义结构体试试

在这里插入图片描述

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

int main(int argc, const char *argv[])
{
	struct Yang
	{
		char name[20];
		int age;
		char sex;
		int weight;
		struct Message
		{
			char place[20];
			char varieties[30];
			int id;
		}message;
	}yang1;

	strcpy(yang1.name,"yyyy");
	yang1.age = 6;
	yang1.sex = 'm';
	yang1.weight = 21;
	strcpy(yang1.message.place,"内蒙古");
	strcpy(yang1.message.varieties,"鄂尔多斯细毛羊");
	yang1.message.id = 10034;

	printf("yang1.name = %s,yang1.age = %d,yang1.sex = %c,yang1.weight = %d\n",
			yang1.name,yang1.age,yang1.sex,yang1.weight);

	printf("yang1.place = %s,yang1.varieties = %s,yang1.id = %d\n",
			yang1.message.place,yang1.message.varieties,yang1.message.id);


	return 0;
}

在这里插入图片描述

结构体数组

在这里插入图片描述

机构体数组定义

当结构体变量足够多的时候,每次都单独定义一个变量就会变的很麻烦,因此结构体数组就出现了,这里的数组指的是定义的结构体变量是数组的形式

一般形式

struct 结构体名 变量名[元素个数]

这样的话就可以很方便的定义n个结构体变量

结构体数组使用

因此对于栗子一里面的定义的三个结构变量,这里可以同时赋值

举个栗子

对栗子一进行改造

在这里插入图片描述

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

int main(int argc, const char *argv[])
{
	int i;

	struct Yang
	{
		char name[20];
		int age;
		char sex;
		int weight;
	}yang[3] = {{"ffff",6,'m',20},
				   {"hhhh",5,'m',15},
				   {"wwww",3,'f',12}};

	for(i = 0;i < 3;i++){
		printf("yang[%d].name = %s,yang[%d].age = %d,yang[%d].sex = %c,yang[%d].weight = %d\n",
				i,yang[i].name,i,yang[i].age,i,yang[i].sex,i,yang[i].weight);
	}

	return 0;
}

在这里插入图片描述

结构体指针

在这里插入图片描述

结构体指针定义

可以设定一个指针变量用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址,该指针称为结构体指针

一般形式

struct 结构体名 *结构体指针

结构体指针使用

在这里插入图片描述

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

int main(int argc, const char *argv[])
{
	struct Yang
	{
		char name[20];
		int age;
		char sex;
		int weight;
	};

	struct Yang *p;

	strcpy(p->name,"ffff");
	p->age = 6;
	p->sex = 'f';
	p->weight = 13;

	printf("p->name = %s,p->age = %d,p->sex = %c,p->weight = %d\n",
			p->name,p->age,p->sex,p->weight);


	return 0;
}

在这里插入图片描述


p+1 指向yang[1]的首地址的内容
++p 指向yang[1]的首地址的内容
p++ 在程序执行后,指向yang[1]的首地址的内容


在这里插入图片描述

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

int main(int argc, const char *argv[])
{
	int i;

	struct Yang
	{
		char name[20];
		int age;
		char sex;
		int weight;
	}yang[3] = {{"ffff",6,'m',20},
				{"hhhh",5,'m',15},
				{"wwww",3,'f',12}};

	struct Yang *p;

	p = &yang[0];

	for(i = 0;i < 3;i++){
		printf("yang[%d].name = %s,yang[%d].age = %d,yang[%d].sex = %c,yang[%d].weight = %d\n",
				i,yang[i].name,i,yang[i].age,i,yang[i].sex,i,yang[i].weight);
	}

	printf("s = %s\n",p+1);
	printf("s = %s\n\n",p);

	printf("s = %s\n",++p);
	--p;
	printf("s = %s\n\n",p);

	printf("s = %s\n",p++);
	printf("s = %s\n",p);
	--p;
	printf("s = %s\n\n",p);

	return 0;
}

在这里插入图片描述

更多内容

Linux-C P1 Linux基础与Vi操作

Linux-C P2 数据类型

Linux-C P3 运算符和表达式

Linux-C P4 输入输出

Linux-C P5 控制语句

Linux-C P6 数组

Linux-C P7 指针

Linux-C P8 函数

Linux-C P9 内存管理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CagePan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值