C语言--结构体

一.结构体类型的声明

1.1结构体的基础知识

结构是一些值的集合,这些值称为成员变量。

结构的每个成员可以是不同类型的变量。

我们通常利用结构体来描述复杂类型。

1.2结构体的声明
struct tag
{
	member_list;//成员列表
}variable_list;//变量列表

tag:结构体的名字,依据实际情况进行名字的选择或者命名

member_list:成员列表,可以存在1个或者多个

variable_list:变量列表

下面是一个例子:

//描述一个学生
//名字+年龄+性别

struct Stu
{
	//成员变量,用来描述结构体对象的相关属性
	char name[20];
	int age;
	char sex[5];//男 女 保密
}s2,s3,s4;//s2,s3,s4就是结构体变量---全局变量

int main()
{
	struct Stu s1;

	//Stu s2; //在C语言中,没有对结构体类型typedef,struct不可省略

	return 0;
}

其中,存在name,age,sex三个成员变量,用来描述结构体对象的相关属性。

s2,s3,s4就是结构体变量---全局变量。它们是具体去运用这个结构体变量,进行相关初始化之后建立的变量,可以把前面的四行代码(结构体的声明)类比为图纸,我们知道需要什么,而s2,s3,s4就是基于此建立的具体的房子。

1.3结构体的成员类型

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

//结构体的成员类型
//标量,数组,指针,甚至是其他结构体
struct A
{
	int a;
	char arr[5];
	int* p;
};

struct B
{
	int b;
	char arr1[10];
	int* pp;
	double c;
	struct A AA;
};

我们可以看到,在struct A中,存在int,char,指针等多种类型;在struct B中,存在int,char,指针,double,结构体等多种类型

二.结构体的初始化

创建方法:

1.声明类型的同时进行定义

2.定义

3.结构体嵌套定义

4.在main函数中定义

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

//创建
struct A
{
	int a;
	char arr[5];
	int* p;
}A1;//声明类型的同时定义变量

struct A A2;//定义结构体变量

struct B
{
	int b;
	char arr1[10];
	int* pp;
	double c;
	struct A A3;//结构体嵌套定义
};

int main()
{
	struct A A4;//在main函数中定义

	return 0;
}

A1是直接在声明类型处进行变量的定义,A2是直接定义结构体变量,A3是结构体嵌套定义,A4在main()函数中定义。

在创建处进行初始化。

//初始化
struct A
{
	int a;
	char arr[5];
	int* p;
}A1 = {10,"ha",NULL};//初始化方式1

struct A A2 = { 60,"h",NULL };//初始化方式2

int main()
{
	struct A A3 = { .arr = "haha",.a = 100,.p = NULL};//初始化方式3
	printf("%d %s %p\n", A3.a, A3.arr, A3.p);
	return 0;
}

三.结构体的成员访问

通过点操作符(.)进行结构体成员的访问。

#include<string.h>
struct Stu
{
	char name[20];
	int age;
};
void set_stu(struct Stu* ps)
{
	(*ps).age = 20;
	//t.name = "张三";//报错
	strcpy((*ps).name, "张三");//字符串拷贝,把"张三"拷贝到t.name
}
void print_stu(struct Stu t)
{
	printf("%s %d\n", t.name, t.age);
}
int main()
{
	struct Stu s = { 0 };
	set_stu(&s);
	print_stu(s);
	return 0;
}

四.结构体传参

函数传参的时候,参数是需要压栈的。

如果传递一共结构体对象的时候,结构体过大,参数压栈的系统开销较大,会导致性能下降。

struct S
{
	int data[1000];
	int num;
};
struct S s = { {1,2,3,4}, 1000 };
//结构体传参
void print1(struct S s)
{
	printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
	printf("%d\n", ps->num);
}
int main()
{
	print1(s);  //传结构体
	print2(&s); //传地址
	return 0;
}

在main()函数中,print1(s)传结构体,会传1000个空间。print2(&s)传地址,会传4/8个字节。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值