【C语言】结构体

本文深入讲解了结构体的声明方法,包括直接和typedef方式,以及如何定义和初始化结构体变量。重点介绍了结构体成员的调用与传参技巧,强调了局部变量和结构体指针的应用。了解如何高效利用结构体提升代码性能是关键。
摘要由CSDN通过智能技术生成

1. 结构体的声明

结构是一些值得集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

结构的声明1:

struct tag
{
    member-list;
}variable-list;

例如:

//struct为结构体关键字; Stu为结构体标签; struct Stu为结构体类型
struct Stu
{
    //成员标签
	char name[20];
	short age;
	char tel[12];
	char sex[5];
}s1,s2,s3;        //s1,s2,s3为变量列表,属于全局变量

int main()
{
	struct Stu s;    //创建结构体变量,属于局部变量
	return 0;
}

一般来说,在程序里应该尽可能少的创建全局变量,所以结构体声明一般不创建结构体变量,而是通过创建局部结构体变量的方式来创建。代码应改为:

//struct为结构体关键字; Stu为结构体标签; struct Stu为结构体类型
struct Stu
{
    //成员标签
	char name[20];
	short age;
	char tel[12];
	char sex[5];
};

int main()
{
	struct Stu s;    //创建结构体变量,属于局部变量
	struct Stu s1; 
	struct Stu s2; 
	struct Stu s3; 
	return 0;
}

结构体声明2:

typedef struct tag
{
    member-list;
}alias;

例如:

typedef struct Stu
{
	char name[20];
	short age;
	char tel[12];
	char sex[5];
}Stu;                 //此处加上typedef就是将结构体类型struct Stu直接命名为Stu

int main()
{
	struct Stu s;
	Stu s1;            //使用typedef之后创建结构体变量可直接使用别名+变量名的形式创建
	Stu s2;
	Stu s3;
	return 0;
}

通过以上声明可知:结构体的成员可以是标量、数组、指针,甚至是其它结构体.

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

结构体变量定义1:声明类型的同时定义变量p1(此时p1为全局变量)

struct Point
{
    int x;
    int y;
}p1;                    

结构体变量定义2:在主函数或其他函数内部定义结构体变量,此时为局部变量

struct Point p2;

结构体变量的初始化:结构体变量在创建的同时给它赋值叫做结构体变量的初始化。和数组初始化类似,结构体变量初始化也是采用大括号的形式,大括号内的内容根据结构体的声明成员列表形式来确定。例如:

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


int main()
{
	Stu s1 = { "张三",20,"16666666666","男" };    //结构体变量初始化
	Stu s2 = { "李四",22,"18888888888","女" };
	return 0;
}

再如:

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

typedef struct T
{
    char ch[10];
    Stu s;
    char* pc;
}T;


int main()
{
	T t = {"hello", {"张三",20,"16666666666","男"}, NULL};    //嵌套结构体初始化
	return 0;
}

3. 结构体成员的调用及传参

定义完结构体变量之后,调用结构体成员的方法有两种:

  • 结构体变量.结构体成员
  • 结构体变量指针->结构体成员

例如:创建两个打印结构体函数

void print1(Stu tmp)
{
	printf("name:%s\n", tmp.name);
	printf("age:%d\n", tmp.age);
	printf("tel:%s\n", tmp.tel);
	printf("sex:%s\n", tmp.sex);
}

void print2(Stu* tmp)
{
	printf("name:%s\n", tmp->name);
	printf("age:%d\n", tmp->age);
	printf("tel:%s\n", tmp->tel);
	printf("sex:%s\n", tmp->sex);
}

int main()
{
	Stu s = {"张三",20,"16666666666","男"};  
	print1(s);
	print2(&s);
	return 0;
}

由于函数形参是实参的临时拷贝,所以print1函数会花费更多的空间和时间,因此,其性能更低。

函数传参的时候,参数是需要压栈(插入元素)的。如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。

在这里插入图片描述

结论:结构体传参的时候,要传结构体的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值