zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【C语言】初阶结构体详细讲解

2023-04-18 14:13:55 时间

在这里插入图片描述

1. 结构体的声明

1.1 结构的基础知识

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

1.2 结构的声明

1
struct Book
{
	char name[20];
	int price;
};

2
struct Book
{
	char name[20];
	int price;
}b3, b4, b5;

3
typedef struct Book
{
	char name[20];
	int price;
}Book;
Book b3;
Book b4;
typedef struct Node
{
	int data;
	struct Node* next;
}Node;

int main()
{
	struct Book b1;
	struct Book b2;
	Book b3;

	return 0;
}


struct Book
{
	char name[20];
	int price;
};

typedef struct Book Book;

例如描述一个学生:

typedef struct Stu
{
     char name[20];//名字
    int age;//年龄
    char sex[5];//性别
    char id[20];//学号
}Stu;//分号不能丢
struct Point
{
    int x;
    int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。

1.3 结构成员的类型

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

struct S
{
	char c;
	char arr[10];
	int* p;
}s1, s2;

struct S s3;

struct B
{
	int a;
	struct S s;
	double d;
}sb1, sb2;

struct B sb3;

int main()
{
	struct S s4 = {'c', "zhangsan", NULL};

	int a = 10;
	struct B sb4 = { 100, {'q', "lisi", &a}, 3.14};

	return 0;
}

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

有了结构体类型,那如何定义变量,其实很简单。

struct Point
{
	int x;
	int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。
struct Point p3 = { x, y };
struct Stu //类型声明
{
	char name[15];//名字
	int age; //年龄
};
struct Stu s = { "zhangsan", 20 };//初始化
struct Node
{
	int data;
	struct Point p;
	struct Node* next;
}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化
struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

2. 结构体成员的访问

结构体变量访问成员
结构变量的成员是通过点操作符(.)访问的。点操作符接受两个操作数。
我们如何访问s的成员?

struct S s;
strcpy(s.name, "zhangsan");//使用.访问name成员
s.age = 20;//使用.访问age成员

结构体指针访问指向变量的成员
有时候我们得到的不是一个结构体变量,而是指向一个结构体的指针。
那该如何访问成员。
如下:

struct Book
{
	char name[20];
	int price;
};

void print(struct Book* p)
{
	printf("%s %d
", p->name, p->price);
}

int main()
{
	struct Book b1 = {"我的C语言", 66};
	struct Book b2 = { .price = 80, .name = "我的C++"};
	//结构体变量.结构体成员
	printf("%s %d
", b1.name, b1.price);
	printf("%s %d
", b2.name, b2.price);
	//结构体指针->结构体成员
	//struct Book* p1 = &b1;
	print(&b1);
	return 0;
}

3. 结构体传参

struct S
{
	int arr[100];
	int n;
};

void print1(struct S ss)
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", ss.arr[i]);
	}
	printf("
%d
", ss.n);
}

void print2(struct S* ps)
{
	int i = 0;
	for (i = 0; i < 10; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("
%d
", ps->n);
}

int main()
{
	struct S s = { {1,2,3,4,5}, 100 };
	print1(s);
	print2(&s);

	return 0;
}

上面的 print1 和 print2 函数哪个好些?
答案是:首选print2函数。
原因:

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

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

如果这份博客对大家有帮助,希望各位给恒川一个免费的点赞作为鼓励,并评论收藏一下,谢谢大家!!!
制作不易,如果大家有什么疑问,或给恒川的意见,欢迎评论区留言。