C语言结构体讲解

 一.结构体的使用

        结构是一些值的集合,这些值称为成员变量。而结数组与结构体最大的区别在于,数组中存储的只能是同一种类型的元素集合,结构体中的成员变量可以是各种数据类型的成员变量。

1.结构体的创建形式

struct tag {                        //struct tag是结构体的类型名称

member-list;                     //member-list是成员变量(可以是一个,也可以是多个)

};                    

        struct是结构体的关键字,就好比int ,float,double这些数据类型一般 ,后面的tag才是结构体的名字。

//结构体
struct Peo {
	char name[20];	//姓名,(字符数组)--限制了输入字符的字符数
	int age;		//年龄
	char tale[12];	//电话号
	char sex[5];	//性别
};

        注:结构体的成员类型可以是变量、数组、指针或者其他结构体(嵌套)。 

2.结构体的初始化 

         结构体的初始化并不能在结构体中进行,需要在在结构体的外面,或者main函数内部执行操作。

struct Peo {
	char name[20];	//姓名,(字符数组)--限制了输入字符的字符数
	int age;		//年龄
	char tale[12];	//电话号
	char sex[5];	//性别
};

struct Peo pe = { "zhangsan",25,"15792132",'男' };



int main() {
	struct Peo p1 = { "小橙",22,"1456544654","男"};

return 0;
    }

     上图代码中,通过编写结构体,我在其外部创建了结构体的变量(实际上称之为对象更好一些,但C语言是面向过程的编程语言,是没有对象可言的。),通过变量可以给结构体的成员变量初始化赋值。

       其实结构体就好比一张盖房子的图纸,而结构体变量的创建就是盖房子。只有把图纸的方案修订好,我们才能根据图纸的意思去造房子。图纸永远是虚幻的,它是不占房子的一丝空间,只是决定了房子修盖的方向与类型,所以说结构体的创建不会在内存中留有位置,只有在创建变量赋值的时候才会被拿来用。

3.嵌套结构体

//结构体
struct Peo {
	char name[20];	//姓名,(字符数组)--限制了输入字符的字符数
	int age;		//年龄
	char tale[12];	//电话号
	char sex[5];	//性别
};


struct List {
	int num;
	float pai;
	struct Peo p1;//嵌套结构体
};

        嵌套一词,我们在学习循环的时候就已经了解,一层套一层,结构体也是同理。所以赋值的时候内层的结构体中的成员变量要单另用花括号括起来。

struct List l1 = { 100,3.14,{"小圆",21,"1785610","女"} };

二.结构体的访问方式(两种)

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


struct Peo {
	char name[20];	//姓名,(字符数组)--限制了输入字符的字符数
	int age;		//年龄
	char tale[12];	//电话号
	char sex[5];	//性别
};


struct List {
	int num;
	float pai;
	struct Peo p1;//嵌套结构体
};


int main() {

    struct Peo p1 = { "小橙",22,"1456544654","男"};
	struct List l1 = { 100,3.14,{"小圆",21,"1785610","女"} };
	printf("%s %d %s %s\n", p1.name, p1.age, p1.tale, p1.sex);
	printf("%d %f,%s %d %s %s\n", l1.num,l1.pai,l1.p1.name, l1.p1.age, l1.p1.tale, l1.p1.sex);

 

 

         对象.成员变量即可访问结构体变量初始化后的所有数据。 

 

2.结构体传址

结构体变量通过地址传递给指针,指针可以通过指针(->)箭头访问成员变量。


struct Peo {
	char name[20];	//姓名,(字符数组)--限制了输入字符的字符数
	int age;		//年龄
	char tale[12];	//电话号
	char sex[5];	//性别
};

struct List {
	int num;
	float pai;
	struct Peo p1;//嵌套结构体
};

void Print2(struct List* ps) {
	printf("%d %f %s %d %s %s \n", ps->num, ps->pai, ps->p1.name, ps->p1.age,ps->p1.tale,ps->p1.sex);
}

int main() {

	struct List l1 = { 100,3.14,{"小圆",21,"1785610","女"} };

	//结构体访问方式 :对象.成员名,指针->成员名
	Print2(&l1);

 

 

 

void Print1(struct Peo ss) {
	printf("%s %d %s %s\n", ss.name, ss.age, ss.tale, ss.sex);
}

void Print2(struct List* ps) {
	printf("%d %f %s %d %s %s \n", ps->num, ps->pai, ps->p1.name, ps->p1.age,ps->p1.tale,ps->p1.sex);
}

         对于结构体变量传参,函数传参的时候,参数是需要压栈的。 如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。所以需要用到地址传递方式--省空间,所以在编写过量程序的时候,大家尽量用到地址传递方式。

结构体就讲到这里,谢谢观看!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

橙予清的zzz~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值