Sunset
705 字
4 分钟
结构与函数
结构与函数
基本特点
没有直接的方式可以一次读入(scanf)一个结构。
在函数内使用结构体,和普通变量一样是传值类型,相当于是拷贝过去一个一个结构体。
比如这样:
int a(struct a b) { int a; float b;};这样就会传送过去一个名为a的结构体变量,这个变量的名字叫b,包含ab两个元素。
传指针
当然更推荐传指针过去啦!因为在c语言里直接传递数据是拷贝的方式去传递的。
结构体指针
在一个结构体里:
struct point { int x; int y;} myday;想要访问这个结构体的地址,就需要指向这个结构体:
struct point *p = &myday;(首先表示了这是一个结构体,然后指明了是哪个结构体,接下来再选中了一个结构体的特定变量,让指针指向这个变量)
(其实结构体可以看成一种自己规定的数据类型)
访问成员
-> 运算符
在这里想要访问具体的每一个成员,则需要用->符号表示指针变量所指的成员:
p->x = 114514;(*p).x 写法
(*p).x = 114514;(*p)实质上是括起来,表示后面的东西是指针,”.”实质上是表示这是个结构体的成员,x则是结构体成员。
实际上是一样的,当然第一种更形象,更好用。
const 保护
如果不希望传入函数的结构体的值被改变,可以加上const来让保证值不会随便更改。但如果这样的话,在传入的时候也需要标注清楚是const类型的结构体。
函数参数声明
传入结构体的时候,需要标注数据类型的完整样式,比如:
void(struct student qwq1);这样才能传入一个结构体,但是这样只是拷贝了过去,只能实现参数的传递,不能随便调取。
完整示例
以下是一个简单介绍结构体传入函数的使用的例子:
#include<stdio.h>
struct person { char name[10]; //成员姓名 char sex; //成员性别 double salary; //平日工资 double extra_gains; //外快收入};
double sum(struct person *who) // 将指针作为参数{ who->extra_gains += who->salary; return( who->extra_gains);}
int main(){ struct person Zhangsan = { "张三", 'm', 20000, // 张三日常划水的工资收入 10000000, // 法外狂徒的外快收入 }; printf("张三一个月的收入有%.2f元\n", sum(&Zhangsan)); printf("此时Zhangsan的extra成员的值为:\t%.2f\n", Zhangsan.extra_gains); return 0;}总结
函数应该标注清楚自己接受的是一个名叫xxx(xxx)的结构体(struct)中的一个地址(*a),指向了一个变量a。
那么写出来就是这样的东西:
void hanshu(struct xxx *a);