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

在这里插入图片描述

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\n", p->name, p->price);
}

int main()
{
    
    
	struct Book b1 = {
    
    "我的C语言", 66};
	struct Book b2 = {
    
     .price = 80, .name = "我的C++"};
	//结构体变量.结构体成员
	printf("%s %d\n", b1.name, b1.price);
	printf("%s %d\n", 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("\n%d\n", ss.n);
}

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

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

	return 0;
}

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

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

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

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

猜你喜欢

转载自blog.csdn.net/m0_75058342/article/details/129478313