705 字
4 分钟
--
结构与函数
2023-10-30

结构与函数#

基本特点#

没有直接的方式可以一次读入(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);
结构与函数
https://vilstia.org/posts/学习笔记/c/结构与函数/
作者
琴泠 - Lumina Qin
发布于
2023-10-30
许可协议
CC BY-NC-SA 4.0