当前位置:网站首页>初阶C语言 - 结构体
初阶C语言 - 结构体
2022-07-16 02:05:00 【渡上舟(每天都要坚持学习鸭)】
目录
1. 结构体的声明
1.1 结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构是一种集合。结构中的每个成员可以是不同类型。
类比和区别:数组是一组相同类型元素的集合,放在数组中的所有元素类型是相同的。
目前我们已经学过一些类型 : 字符型(char),整型(short,int...),浮点型(float,double) ,这些类型是内置类型。
但是生活中总会有一些复杂对象,比如:人,人有姓名,性别,电话,身高等;再比如:书,书有书名,作者,定价,书号等,这些复杂对象无法用内置类型来描述。那么如何来描述这些复杂对象呢?于是就有了结构体的出现,结构体是一种用户定义的数据类型,即自定义类型,是用来描述复杂对象的。
1.2 结构体类型的声明
struct:结构体关键字,它表明是个结构体,结构体的声明必须有struct。
结构体标签:它是你给你的结构体类型取的名字
struct 结构体标签:这表示一个结构体类型
成员列表:可以有多个成员,每个成员有各自的数据类型和成员变量名。
结构体变量列表:可以有多个变量,是使用结构体类型创建的变量,一般结构体变量列表省略不写,先先进行结构体声明,之后再创建结构体变量。
举一个结构体类型声明的例子:

下面是有结构体变量列表的情况

1.3 结构体成员的类型
结构体的成员可以是标量(int,float,double)、数组、指针,甚至是其他结构体(变量)。
比如:

1.4 结构体变量的创建和初始化
1.4.1 结构体变量的创建:
创建局部变量p1:

类型不占用内存,只有用类型创建变量后才占用内存。
创建全局变量p2,p3:

1.4.2 结构体变量的初始化:
初始化:创建变量的同时给变量赋值。


2. 结构体成员的访问
结构体变量 . 结构体成员变量
结构体指针 -> 结构体成员变量
2.1 结构体变量访问结构体成员
结构体变量通过点操作符(.)访问结构体成员。
结构体变量 . 结构体成员变量
像这样:

举例1:
#include <stdio.h>
//声明的结构体类型是:struct Peo
struct Peo
{
char name[20];
char sex[5];
char tele[12];
int high;
};
//声明的结构体类型是:struct S
struct S
{
struct Peo p;
int sum;
float f;
};
int main()
{
struct Peo p1 = { "张三","男","12366784567",183 };
struct S s = { {"李四","男","12366784567",186},10,3.14f };
printf("%s %s %s %d\n",p1.name,p1.sex,p1.tele,p1.high);
printf("%s %s %s %d %d %f",s.p.name,s.p.sex,s.p.tele,s.p.high,s.sum,s.f);
return 0;
}
举例2:结构体传参(传的是结构体变量)

代码如下:
#include <stdio.h>
//声明的结构体类型是:struct Peo
struct Peo
{
char name[20];
char sex[5];
char tele[12];
int high;
};
void print(struct Peo sp)//结构体类型的变量来接收
{
printf("%s %s %s %d\n", sp.name, sp.sex, sp.tele, sp.high);
}
int main()
{
struct Peo p1 = { "张三","男","12366784567",183 };
print(p1);//传的是结构体类型的变量
return 0;
}
2.2 结构体指针访问结构体成员
结构体指针通过操作符(->)访问结构体成员。
结构体指针 -> 结构体成员变量
像这样:

举例:结构体传参(传的是结构体变量的地址)
#include <stdio.h>
//声明的结构体类型是:struct Peo
struct Peo
{
char name[20];
char sex[5];
char tele[12];
int high;
};
void print(struct Peo* sp)//结构体类型的指针来接收
{
printf("%s %s %s %d\n", sp->name, sp->sex, sp->tele, sp->high);
}
int main()
{
struct Peo p1 = { "张三","男","12366784567",183 };
print(&p1);//传的是结构体变量名的地址,结构体类型的地址
return 0;
}
2.3 结构体成员的访问的总结
结构体变量 . 结构体成员变量
结构体指针 -> 结构体成员变量
举例:

代码如下:
#include <stdio.h>
//声明的结构体类型是:struct Peo
struct Peo
{
char name[20];
char sex[5];
char tele[12];
int high;
};
//声明的结构体类型是:struct S
struct S
{
struct Peo p;
int sum;
float f;
};
void print(struct Peo* sp,struct S* ss)//结构体类型的指针来接收
{
printf("%s %s %s %d\n",sp->name,sp->sex,sp->tele,sp->high);
//结构体指针->结构体成员变量:sp->name
printf("%s %s %s %d %d %f\n",ss->p.name,ss->p.sex,ss->p.tele,ss->p.high,ss->sum,ss->f);
//结构体指针->结构体成员变量:ss->p 结构体变量.结构体成员变量:p.name
}
int main()
{
struct Peo p1 = { "张三","男","12366784567",183 };
struct S s = { {"李四","男","12366784567",186},10,3.14f };
print(&p1,&s);//传的是结构体变量名的地址,结构体类型的地址
return 0;
} 
3. 结构体传参
结构体传参的时候,要传结构体的地址。
如果传的是结构体变量,形参是实参的一份临时拷贝,会造成大量内存空间的浪费。
如果传的是结构体的地址,形参接收到的是个指针,形参部分只要开辟一个指针变量的大小的内存空间,只需要4个字节或8个字节,减少空间的浪费。
边栏推荐
- Map set to object, map field has horizontal lines, object to map
- Part 50 - Analysis of a query request header parameter [2022-07-14]
- openEuler 知:常用网址
- [jailhouse article] bao: a modern lightweight embedded hypervisor (2020)
- Opensource knowledge: embedded software list
- gradle项目中 build.gradle 配置文件详解(未完成)
- Statistics of Top100 domestic NFT Platform Alliance chain and public chain usage
- [object conversion] vo2dto use
- 1523. 在区间范围内统计奇数数目
- Use of gin framework
猜你喜欢

三个步骤,一天就搞定了MySQL,让我顺利拿下了天猫offer

Simulation of common functions in C language

Restrict ASML from supplying lithography machines to China? In fact, it has been inseparable from the Chinese market

Flink basic record supplement

Why is private domain operation so popular? How can enterprises do their private domain operations well?

thinkphp 代码执行 (CNVD-2018-24942)

Reverse learning notes (I)

【Jailhouse 文章】Bao: a modern lightweight embedded hypervisor(2020)

Terraform命令行工具介紹、安裝、使用

面试高频:MySQL是怎么保证高可用的?
随机推荐
汉字风格迁移篇--基于生成对抗网络的无监督字体风格转换模型
数据库定时备份linux篇
ThinkPHP code execution (cnvd-2018-24942)
pinctrl子系统和gpio子系统
openEuler 知:官方社区
三个步骤,一天就搞定了MySQL,让我顺利拿下了天猫offer
Opensource knowledge: embedded software list
c语言基础篇:指针(初阶)
Binary tree traversal
C语言动态内存管理 —— 仅仅四个函数而已
On July 16, 2022, the results of cdga/cdgp data governance certification examination came out!
社区峰会|Pulsar Summit 旧金山峰会议题亮点曝光!
Gin框架的使用
openEuler 知:repo
Luogu questionnaire - high accuracy
Restrict ASML from supplying lithography machines to China? In fact, it has been inseparable from the Chinese market
Terraform命令行工具介紹、安裝、使用
Free SSL certificate application and deployment practice
Build Detailed explanation of gradle configuration file (incomplete)
面试高频:MySQL是怎么保证高可用的?