admin管理员组

文章数量:1487745

详解C语言结构体

1.结构体的声明

1.1 结构体的基础知识

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

如果说数组是一组相同类型元素的集合,那么结构体就是一组不一定相同元素的集合

1.2 结构的声明

代码语言:javascript代码运行次数:0运行复制
struct tag
{
	member-list;
}variable-list;

当我们描述一个学生时:

代码语言:javascript代码运行次数:0运行复制
struct stu
{
	char name[10];//姓名
	int age;//年龄
	char sex[10];//性别
};

1.3 结构成员的类型

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

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

有了结构体类型,那么接下来就要定义变量了。

代码语言:javascript代码运行次数:0运行复制
//代码1
#include <stdio.h>
struct stu
{
	char name[10];//姓名
	int age;//年龄
	char sex[10];//性别
};

int main()
{
	struct stu s = { "yui",17,"female" };
	printf("姓名:%s 年龄:%d 性别:%s\n", s.name, s.age, s.sex);
	return 0;
}
//打印结果:姓名:yui 年龄:17 性别:female

//代码2

struct Point
{
	int x;
	int y;
}p1;//声明类型的同时定义变量p1;

struct Point p2//定义结构体变量p2

//初始化:定义变量的同时赋初值
struct Point p3 = {x,y};

struct stu
{
	char name[10];
	int age;
};

struct stu s = {"yui",17};//初始化

struct node
{
	int data;
	struct Point p;
	struct node* next;
}n1 = {10,{4,5},NULL};//结构体嵌套初始化

struct node n2 = {20,{5,6}.NULL}//结构体嵌套初始化

2.结构体成员的访问

  • 结构体变量访问成员 结构体变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。 例如:
代码语言:javascript代码运行次数:0运行复制
struct stu
{
	char name[10];
	int age;
};
struct stu s;
结构体初始化

我们可以看到s有成员name``````age 那我们如何访问s的成员?

代码语言:javascript代码运行次数:0运行复制
struct stu s;
strcpy(stu.name,"yui");//使用.访问name成员
s.age = 20;//使用.访问age成员
  • 结构体指针访问指向变量的成员 有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针
代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
struct stu
{
	char name[10];//姓名
	int age;//年龄
	char sex[10];//性别
};

void print(struct stu* ps)
{
	//使用结构体指针访问指向对象的成员
	printf("姓名:%s 年龄:%d 性别:%s\n", ps->name, ps->age, ps->sex);
}
int main()
{
	struct stu s = { "yui",17,"female" };
	print(&s);//结构体地址传址
	return 0;
}

//打印结果:
//姓名:yui 年龄:17 性别:female

3.结构体传参

代码语言:javascript代码运行次数:0运行复制
#include <stdio.h>
struct stu
{
	char name[10];//姓名
	int age;//年龄
	char sex[10];//性别
};
//结构体传参
void print1(struct stu s)
{
	printf("姓名:%s 年龄:%d 性别:%s\n", s.name, s.age,s.sex);
}
//结构体地址传参
void print2(struct stu* ps)
{
	printf("姓名:%s 年龄:%d 性别:%s\n", ps->name, ps->age, ps->sex);
}
int main()
{
	struct stu s = { "yui",17,"female" };
	print1(s);//传结构体
	print2(&s);//传地址
	return 0;
}
//打印结果:
/*
姓名:yui 年龄:17 性别:female
姓名:yui 年龄:17 性别:female
*/

如果我们要对函数传递结构体时,传地址会更好。

函数传参的时候,参数是要压栈的。 如果传递的结构体太大了,参数压栈的系统开销比较大,所以会导致性能的下降。 如果你需要保留函数中对结构体的修改,也是需要传递地址的。

综上: 结构体传参的时候,尽量传结构体的地址。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-10-15,如有侵权请联系 cloudcommunity@tencent 删除变量函数集合指针struct

本文标签: 详解C语言结构体