48.【C语言】结构体补充

承接20.【C语言】初识结构体(重要)中的结构体成员的访问

目录:

1.结构体创建

2.利用函数控制结构体

3.使用"结构体指针变量-->结构体成员变量"来修改结构体的数据

4.传值还是传址?

1.结构体创建

依据第20篇,可以创建出:

cpp 复制代码
struct S
{
	int arr[1000];
	int n;
};

int main()
{
	struct S s = { {1,2,3,4,5},100 };
	return 0;
}

解读:

定义结构体S中的两个结构体成员,分别为arr整型数组和整型变量n

s为arr和n赋值,arr的前5个元素分别赋值为1,2,3,4,5,其余默认为0,n赋值为100

struct S s:S代表结构布局,s代表结构变量

2.利用函数控制结构体

现创建函数set_Stu来改变结构体S中的数据,创建print_Stu来打印结构体S中的数据

分析一下代码是否能正常完成修改:

cpp 复制代码
#include <stdio.h>
struct S
{
	int arr[1000];
	int n;
};

void print_Stu(struct S t)
{
	for (int i = 0; i < 5; i++)
	{
		printf("%d ", t.arr[i]);
	}
	printf("\nn=%d", t.n);
}

void set_Stu(struct S t)
{
	t.n = 150;
	t.arr[0] = 3;
}

int main()
{
	struct S s = { {1,2,3,4,5},100 };
	set_Stu(s);
	print_Stu(s);
	return 0;
}

答案:显然不行,改变形参(t)不可能改变实参(s)(这是传调用)

应该传址调用

类比函数的定义(29.【C语言】函数系列中 自定义函数 点我跳转

必须将s的地址(&s)传给set_Stu

但改成这样还是有问题

cpp 复制代码
void set_Stu(struct S *t)
{
	*t.n = 150;
	*t.arr[0] = 3;
}

set_Stu(&s);//省略main函数内的其他部分

"."的优先级比"*"的高,必须加()

所以为:

cpp 复制代码
	(*t).n = 150;
	(*t).arr[0] = 3;

结果:

实际上有结构体独有的写法,而且可读性好

备注:将结构体写入函数的格式说明

上方代码的这几处需要注意

void set_Stu(struct S *t)

struct S s = { {1,2,3,4,5},100 };

set_Stu(&s);

print_Stu(s);

Q:为什么不写成set_Stu(struct S s); print_Stu(struct S s);呢?

A:类比一般函数的传参

cpp 复制代码
int a=0; 
int function(int a)
{ 
  //......
}

int a=0; 中int是变量类型,a是变量名,0是变量值

传参时function(int a)中int是变量类型,a是变量名

同样对于结构体:

struct S s = { {1,2,3,4,5},100 };

struct S相当于变量类型,s代表变量名

传参传的是变量名

void set_Stu(struct S *t)

struct S相当于变量类型,*t代表变量名

3.使用"结构体指针变量-->结构体成员变量"来修改结构体的数据

cpp 复制代码
	t->n = 150;
	t->arr[0] = 3;

注:->为指向结构体成员运算符,用于访问结构体内的成员

结果依然一样:

4.传值还是传址?

在打印的时候用的是print_Stu(s);

尽管这样能成功实现打印结构体,但是建议使用print_Stu(&s)

原因:结构体与一般的数组不一样,当结构体中的数组比较大时(int arr[9999] )在传值时会复制一份一样的int arr[9999],占用大量空间,降低效率;若传址,则只占用地址的空间

因此:在使用结构体时,建议传址调用

相关推荐
rainFFrain15 分钟前
qt显示类控件---QProgressBar
开发语言·qt
鑫—萍16 分钟前
C/C++精品算法——双指针(1)
c语言·c++·算法
rainFFrain22 分钟前
qt输入类控件---QComboBox/QSpinBox
开发语言·qt
2501_9411118926 分钟前
低延迟系统C++优化
开发语言·c++·算法
未来之窗软件服务39 分钟前
自建开发工具IDE(二)文件托拽读取——东方仙盟炼气期
开发语言·前端·javascript·仙盟创梦ide·东方仙盟
Hello_WOAIAI1 小时前
4.2 python多线程编程:threading 模块深度解析
开发语言·python
2501_941111991 小时前
C++中的装饰器模式变体
开发语言·c++·算法
树下水月2 小时前
python 连接hive2 数据库
开发语言·数据库·python
Tom4i2 小时前
Kotlin 中的 inline 和 reified 关键字
android·开发语言·kotlin
凄戚2 小时前
bash和命令
开发语言·chrome·bash