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

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

相关推荐
聊无生8 分钟前
JavaSrcipt 函数高级
开发语言·前端·javascript
小安同学iter16 分钟前
Java进阶五 -IO流
java·开发语言·intellij-idea
Hello World and You16 分钟前
R ggplot2 绘图细节 geom_text展示不全 y轴坐标细节 x轴标题
开发语言·r语言
sukalot20 分钟前
windows C#-异步文件访问
开发语言·c#
熬夜学编程的小王39 分钟前
【C++篇】从基础到进阶:全面掌握C++ List容器的使用
开发语言·c++·list·双向链表·迭代器失效
悄悄敲敲敲41 分钟前
C++:智能指针
开发语言·c++
书埋不住我1 小时前
java第三章
java·开发语言·servlet
好开心331 小时前
javaScript交互案例2
开发语言·前端·javascript·html·ecmascript·交互
tian-ming1 小时前
(十八)JavaWeb后端开发案例——会话/yml/过滤器/拦截器
java·开发语言·前端
快意咖啡~1 小时前
java.nio.charset.MalformedInputException: Input length = 1
java·开发语言·nio