承接20.【C语言】初识结构体(重要)中的结构体成员的访问
目录:
1.结构体创建
2.利用函数控制结构体
3.使用“结构体指针变量-->结构体成员变量”来修改结构体的数据
4.传值还是传址?
1.结构体创建
依据第20篇,可以创建出:
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中的数据
分析一下代码是否能正常完成修改:
#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
但改成这样还是有问题
void set_Stu(struct S *t)
{
*t.n = 150;
*t.arr[0] = 3;
}
set_Stu(&s);//省略main函数内的其他部分
“.”的优先级比“*”的高,必须加()
所以为:
(*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:类比一般函数的传参
如
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.使用“结构体指针变量-->结构体成员变量”来修改结构体的数据
t->n = 150;
t->arr[0] = 3;
注:->为指向结构体成员运算符,用于访问结构体内的成员
结果依然一样:
4.传值还是传址?
在打印的时候用的是print_Stu(s);
尽管这样能成功实现打印结构体,但是建议使用print_Stu(&s)
原因:结构体与一般的数组不一样,当结构体中的数组比较大时(int arr[9999] )在传值时会复制一份一样的int arr[9999],占用大量空间,降低效率;若传址,则只占用地址的空间
因此:在使用结构体时,建议传址调用