C语言----结构体(初阶)

一.结构体类型的声明

结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
比如:
如果要表示一个学生的姓名、年龄和电话号码等等,就要用到结构体,可以描述复杂类型

1.1结构的声明

struct tag
{
member-list;
}variable-list;

struct是结构体关键字;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;//s1是结构体变量--局部变量
	return 0;
}

还有一种写法:

typedef struct stu
{
	char name[20];
	int age;
	char sex[5];
}stu;
int main()
{
	stu s1;//与前面struct stu s1同
	return 0;
}

typedef是类型重命名,相当于给stu起了个别名
注意:没有对结构体类型typedef,struct关键字不能省略。

1.2结构体成员的类型

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

struct S
{
	int a;
	int arr[5]; 
	int* p;
};
struct B
{
	char ch[10];
	struct S s;
	double d;
};

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

2.1结构体定义变量

struct S
{
	int a;
	char arr[5]; 
	int* p;
}s1;//全局变量
struct S s2;//全局变量
struct B
{
	char ch[10];
	struct S s;
	double d;
};
int main()
{
	struct S s3;//局部变量
	return 0;
}

2.1结构体初始化

struct S
{
	int a;
	char arr[5]; 
	int* p;
}s1 = { 100,"bit",NULL };
struct S s2 = { 98,"haha",NULL };

如果花括号里的初始化内容不按照顺序写,必须加上" . + 成员" 才行

struct S s3 = { .arr = "abc",.p = NULL,.a = 2 };

三.结构体成员的访问

结构体变量访问成员

printf("%d %s %p\n", s3.a, s3.arr, s3.p);//  . 结构体成员访问操作符

结构体里嵌套结构体

	struct B b = { "hello",{3,"hehe",NULL},3.11 };
	printf("%s %d %s %p %lf\n", b.ch, b.s.a, b.s.arr, b.s.p, b.d);

结构体指针访问指向变量的成员
我们先来看一段代码:

struct stu
{
	char name[20];
	int age;
};
void set_stu(struct stu t)
{
	t.age = 20;
	strcpy(t.name, "zhangsan");
}
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;
}

结果是:
在这里插入图片描述
因为传参的时候传的是变量,即传值调用,t是s的临时拷贝,不会改变s,回来的时候又打印s,所以值没有变化。
正确方式:传地址

struct stu
{
	char name[20];
	int age;
};
void set_stu(struct stu* ps)
{
	ps->age = 20;//结构体指针->结构体成员
	strcpy(ps->name, "zhangsan");
}
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;
}

两种方法都能打印出结果,但是print2更好。
因为函数传参的时候,参数是需要压栈的。
如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性能的下降。
结论:
结构体传参的时候,要传结构体的地址。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值