【C语言】浅涉结构体(声明、定义、类型、定义及初始化、成员访问及传参)

简单不先于复杂,而是在复杂之后。

89efcc89ac61428db4d5b6639b2bd948.jpeg 

 

目录

1. 结构体的声明 

1.1 结构体的基础知识

1.2 结构的声明 

1.3 结构成员的类型 

1.4 结构体变量的定义和初始化 

2. 结构体成员的访问 

3. 结构体传参 


 

 

1. 结构体的声明 

1.1 结构体的基础知识

结构是一些值的集合,这些值称为成员变量。

 

结构的每个成员可以是不同类型的变量。 

1.2 结构的声明 

 

 fd2f3dd78c4b468893a47b5fa56e5e93.png

 8790543feb584049b435b8c37efcefb3.png

 de25cc4df09645c0906489ba1081787a.png

 

p1 和 p2 是使用 struct Peo 结构类型创建的两个变量

 

p1 和 p2 是全局变量,但尽量不要使用。

 

b1428aa107f041f683e92b967dd2b707.png

 

struct Peo 是类型,不占内存空间。

 

p1 p2 是结构体变量

1.3 结构成员的类型 

结构的成员可以是变量 、数组、指针、甚至是其他结构体。

 

85e7a66dfbb54664a119275d7f694bd1.png

 

1.4 结构体变量的定义和初始化 

72f6509ef5b04a02a791a8b9e24f3ffb.png 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

struct Peo
{
	char name[20];
	char tele[12];
	char sex[5];
	int high;
}p3, p4;

struct Peo p5, p6;

struct St
{
	struct Peo p;
	int num;
	float f;
};

int main()
{
	struct Peo p1 = { "张三","123456677","男","181" };//结构体变量的初始化
	struct St s = { {"李四","1233244","女","166"}, 100,3.14f };

	return 0;
}

 

2. 结构体成员的访问 

结构体变量访问成员

 

结构体变量的成员是通过点操作符(.)访问的。

 

点操作符接受两个操作数。

 

例如:

 cc16bc16d0e7476c9916e9b5c56efaeb.png

结构体指针访问指向变量的成员:

 

有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。

 

那么该如何访问成员?

如下:

 9562dbc0e15e4a849901e6f2741ad67c.png

 

struct Peo
{
char name[20];
char tele[12];
char sex[5];
int high;
}p3,p4;

struct Peo p5, p6;

struct St
{
struct Peo p;
int num;
float f;
};

void print2(struct Peo* sp)
{
printf("%s %s %s %d\n", sp->name, sp->tele, sp->sex, sp->high);//结构体指针->成员变量
}

void print1(struct Peo p)
{
printf("%s %s %s %d\n", p.name, p.tele, p.sex, p.high);

}
int main()
{
struct Peo p1 = {"张三","123456677","男","181"};//结构体变量的初始化
struct St s = { {"李四","1233244","女","166"}, 100,3.14f};

printf("%s %s %s %d\n", p1.name, p1.tele, p1.sex, p1.high);//结构体变量.成员变量
printf("%s %s %s %d %d %f\n", s.p.name,s.p.tele,s.p.sex,s.p.high,s.num,s.f);

print1(p1);
print2(&p1);

return 0;
}

 

3. 结构体传参 

 0aba570bbffe47cb81ff2e6e071a6396.png

 

函数传参的时候,参数是需要压栈的。

 

如果传递一个结构体对象的时候,结构体过大,参数压栈的系统开销比较大,所以导致性能的下降。

 

总结:结构体传参的时候,要传结构体变量的地址。

 

C语言结构体常见错误包括以下几种情况: 1. 未声明结构体变量:在使用结构体之前,需要先声明结构体变量。如果没有声明结构体变量就直接使用,会导致编译错误。 2. 结构体成员命名冲突:在同一个结构体中,不能有相同名称的成员变量。如果出现了命名冲突,会导致编译错误。 3. 结构体成员类型错误:结构体成员类型必须是合法的C语言类型,不能是其他结构体类型。如果使用了非法的类型,会导致编译错误。 4. 结构体成员访问错误:在访问结构体成员时,需要使用成员运算符“.”。如果使用了其他的运算符或者语法错误,会导致编译错误。 5. 结构体大小计算错误:在计算结构体大小时,需要考虑对齐和填充的规则。如果没有正确计算结构体大小,可能会导致内存访问错误或者数据错乱。 6. 结构体赋值错误:在给结构体赋值时,需要逐个成员进行赋值。如果使用了错误的赋值方式,可能会导致数据错误或者编译错误。 7. 结构体传参错误:在函数参数中传递结构体时,需要使用正确的传参方式。如果使用了错误的传参方式,可能会导致函数调用错误或者数据错误。 8. 结构体嵌套错误:在定义嵌套结构体时,需要注意结构体的顺序和嵌套关系。如果嵌套关系错误,可能会导致数据错误或者编译错误。 9. 结构体成员顺序错误:在定义结构体成员时,需要按照正确的顺序进行定义。如果顺序错误,可能会导致数据错误或者编译错误。 10. 结构体成员初始化:在定义结构体变量时,需要对结构体成员进行初始化。如果没有正确初始化结构体成员,可能会导致数据错误或者编译错误。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

2024_极限年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值