C语言-结构体

142 阅读2分钟

结构体

一、结构体的声明

1. 结构体是一种自定义的数据类型,可用于将不同类型的数据组合起来,这些不同类型的数据就是结构体成员

2. 结构体成员的类型可以是标量,数组,指针,甚至是其他结构体

定义结构体:

struct 结构体名{

数据类型   成员1;

数据类型   成员2;

......

};

创建结构体变量:

1. 通过结构体名直接创建变量

struct   结构体名  结构体变量名;

例:struct student s;

2. 定义结构体时创建变量

例:

struct Student{
int id;

char name[50];//结构体成员为字符数组时通常要指明其长度,便于分配固定内存,该长度明确了能存储的最大字符数

float score;

} student 1,student2;

初始化结构体变量:

初始化:定义变量的同时赋初值

例:

struct student student1={224658,"zhangsan",90};

二、结构体成员的访问

1. 通过结构体变量,运用 “ . ” 操作符来访问结构体成员

例:

printf("学生1的分数是%d\n",student1.score);

2. 通过结构体指针,运用 “→” 操作符来访问结构体成员

例:

void test(struct student* p)

{

printf("%d\n", (*p).id);

printf("%s\n", p→name);

}

三、结构体传参

请看代码:

#include <stdio.h>
struct S {
	int data[1000];
	int num;
};

void print1(struct S s)//函数参数为结构体变量
{
	printf("%d\n", s.num);
}

void print2(struct S* ps)//函数参数为结构体指针
{
	printf("%d\n", ps->num);
}
int main()
{
	struct S s = { {1,2,3,4},1000 };
	print1(s);//结构体变量传参
	print2(&s);//结构体地址传参
	return 0;
}

显然,print2函数更好一些

原因:结构体传参时是需要压栈的,传递结构体变量时,结构体越大,系统压栈的开销越大,性能会下降,因此结构体传参时尽量传递其地址