结构体详解—结构体声明、创建、初始化、访问及传参

结构体类型的声明

结构体的目的是为了描述复杂的对象,例如我们描述一个学生,就不能用简单的float、int来描述,因此就产生了结构体的概念,那我们如何定义一个学生呢?

struct Stu
{
	char name[20];
	short age;
	char tele[12];
	char sex[5];
};

struct 是结构体关键字
Stu 是结构体标签 (可以随意替换)
struct Stu 组合起来就是结构体类型
大括号里面的称为成员变量
到目前为止我们就声明了一个结构体的类型,那我们如何创建呢?

结构体创建

上面相当于创建了一个结构体的类型,但是并没有实际的创建,就相当于我们有一个int类型,如果我们要定定义创建一个变量,就是 int a 此时才创建了一个 int 类型的变量,这一点需要格外注意!
此时定义出来的结构体类型是不占用空间的
创建方式一:

//定义了一个结构体类型 但是此时并没有占用空间
#include <stdio.h>
struct Stu
{
	char name[20];
	short age;
	char tele[12];
	char sex[5];
};
int main()
{
	struct Stu s; //创建局部结构体变量 此时才开辟了空间
	return 0;
}

创建方式二:

#include <stdio.h>
struct Stu
{
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}s1,s2,s3; //创建了s1,s2,s3 三个全局的结构体变量
int main()
{
	return 0;
}

但是方式二并不推荐,因为我们在代码中尽量少创建全局变量。
创建方式三:

#include <stdio.h>
//typedef 的作用是将 struct Stu从新简化起个名字叫Stu
typedef struct Stu
{
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}Stu;
int main()
{
	Stu s; //这里我们在创建局部结构体变量的时候 就用的是Stu
	return 0;
}

结构体成员可以是标量、数组、指针,甚至是结构体。

结构体的初始化

初始化方式一:

#include <stdio.h>
typedef struct Stu
{
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}Stu;
int main()
{
	Stu s={"fancy",20,"13566668888","男"};
	return 0;
}

初始化方式二:

#include <stdio.h>
#include <string.h>
typedef struct Stu
{
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}Stu;
int main()
{
	Stu s;
	s.age=20;
	strcpy(s.name,"book");
	printf("name = %s\n",s.name);
	return 0;
}

结构体的访问

#include <stdio.h>
struct S
{
	char name[20];
	short age;
	double ret;
};
struct T
{
	char arr[10];
	struct S s;
	char* pc;
};
int main()
{
	char arr[]="hello fancy";
	struct T t={"hello",{"fancy",20,3.14},arr};
	printf("%lf\n",t.s.ret);
	printf("%s\n",t.arr);
	printf("%s\n",t.s.name);
	printf("%s\n",t.pc);
	return 0;
}

结构体访问和传参

方式一:

结构体变量

#include <stdio.h>
struct Stu
{
	char name[20];
	short age;
	char tele[12];
};
void print1(struct Stu st)
{
	printf("name = %s\n",st.name);
	printf("age  = %d\n",st.age);
	printf("tele = %s\n",st.tele);
}
int main()
{
	struct Stu s={"fancy",20,"13566668888"};
	print1(s);
	return 0;
}

方式二:

结构体指针

#include <stdio.h>
typedef struct Stu
{
	char name[20];
	short age;
	char tele[12];
}stu;
void print2(stu* ps)
{
	printf("name = %s\n",ps->name);
	printf("age  = %d\n",ps->age);
	printf("tele = %s\n",ps->tele);
}
int main()
{
	stu s={"fancy",20,"13566668888"};
	print2(&s);
	return 0;
}

相比较两种传参方式:方式二更好,因为它只需要传一个地址。
而方式一采用形参的方式必然要拷贝一份数据,这样就会导致内存占用较大。
如果这个结构体比较大,就会导致空间浪费较为严重,同时浪费时间。
而方式二只传一个地址,那一个地址无非就是四个字节或者八个字节。如果对指针变量不理解的,可以看 指针变量的大小。因此方式二的系统开销更小一些。
函数传参的时候,参数是需要压栈的,如果传递一个结构体对象过大,参数压栈的系统开销较大,会导致其性能的下降,具体的我们在 压栈出栈 中详解。
结论:
结构体在传参的时候,尽量传结构体地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值