结构体基础知识

结构体

1. 结构体类型的声明
2. 结构体初始化
3. 结构体成员访问
4. 结构体传参

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

描述一个学生结构体类型 struct结构体关键字
描述一个学生一些数据
名字
年龄
电话
性别
在这里插入图片描述

结构体类型定义方法一

//struct 结构体关键字 Stu结构体标签 struct Stu -结构体类型 
struct Stu  //这是在定义结构体类型
{
    
    
	//成员变量
	char name[20];
	short age;
	char tele[20];
	char sex[5];
}s1,s2,s3;//s1,s2,s3是3个全局的结构体变量
//因为是结构体的声明,所以是语句,结尾要加分号

结构体类型定义方法二

typedef struct Stu  //这是在定义结构体类型
{
    
    
	//成员变量
	char name[20];
	short age;
	char tele[20];
	char sex[5];
}Stuu; //typedef就是对struct Stu 重新起了一个名字叫做Stuu  这里Stuu是类型

初始化结构体

int main()
{
    
    
	Stuu s1 = {
    
    "张三",20,"1232311234","男"};//s1局部变量 结构体初始化 
	struct Stu s2 = {
    
    "旺财",30,"1234132423","保密"};//结构体初始化
	return 0;
}

嵌套结构体初始化

结构体里面包含结构体

struct S
{
    
    
	int a;
	char c;
	char arr[20];
	double d;
};
struct T
{
    
    
	char ch[10];
	struct S s;
	char *pc;
};
int main()
{
    
    
	char arr[] = "hello bit\n";
	struct T t = {
    
     "hehe", {
    
    10,'w',"hello world",3.14},arr };
	printf("%s\n", t.ch);//hehe
	printf("%d\n", t.s.a);//10
	printf("%c\n", t.s.c);//w
	printf("%s\n", t.s.arr);//helloworld
	printf("%lf\n", t.s.d);//3.14
	printf("%s\n", t.pc);//hello bit

	return 0;
}

结构体成员的访问是通过点操作符(.)访问的,点操作符接受两个操作数

结构体传参的两种方法

下面首先完整代码,分别代码在最后

typedef struct Stu
{
    
    
	//成员变量
	char name[20];
	short age;
	char tele[12];
	char sex[5];
}Stuu;
void print1(Stuu tmp)
{
    
    
	printf("name: %s\n", tmp.name);
	printf("age: %d\n", tmp.age);
	printf("telt: %s\n", tmp.tele);
	printf("sex: %s\n", tmp.sex);
}
void print2(Stuu* ps)
{
    
    
	printf("name:%s\n", ps->name);
	printf("age: %d\n", ps->age);
	printf("telt:%s\n", ps->tele);
	printf("sex: %s\n", ps->sex);
	//ps->意思是ps所指向对象的成员
	//ps->age意思是ps所指向对象的年龄
}
int main()
{
    
    
	Stuu s = {
    
    "张三",20,"12345678912","男"};
	//打印结构体数据
	//print1和print2 那个更好?
	//答案是:首选print2h函数原因:
	//函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大
	//参数压栈的系统开销比较大,所以会导致性能的下降

	//结论是:结构体传参的时候,要传结构体的地址首选print2
	//压栈操作
	print1(s);
	print2(&s);
	return 0;
}


方法一 传进来的是整个结构体数据 s

我们尽量不要用上面这种方法

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

方法二 传进来是整个结构体数据的地址&s

我们推荐使用这种方法

void print2(Stuu* ps)
{
    
    
	printf("name:%s\n", ps->name);
	printf("age: %d\n", ps->age);
	printf("telt:%s\n", ps->tele);
	printf("sex: %s\n", ps->sex);
}

打印结构体数据
print1和print2 那个更好?
答案是:首选print2h函数原因:
函数传参的时候,参数是需要压栈的,如果传递一个结构体对象的时候,结构体过大参数压栈的系统开销比较大,所以会导致性能的下降
结论是:结构体传参的时候,要传结构体的地址首选print2
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_52495715/article/details/120537181