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],占用大量空间,降低效率;若传址,则只占用地址的空间

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

相关推荐
励志成为嵌入式工程师16 分钟前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉1 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer1 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq1 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
记录成长java2 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山2 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
hikktn2 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
睡觉谁叫~~~2 小时前
一文解秘Rust如何与Java互操作
java·开发语言·后端·rust
音徽编程2 小时前
Rust异步运行时框架tokio保姆级教程
开发语言·网络·rust
观音山保我别报错2 小时前
C语言扫雷小游戏
c语言·开发语言·算法