结构函数

举报
吴梦青 发表于 2022/06/18 23:49:42 2022/06/18
【摘要】 结构函数

1. 结构运算

#include <stdio.h>

struct date {
	int month;
	int day;
	int year;
};

int main (int argc, char const *argv [] ) {
	struct date today;

	today = (struct date) {
		07, 31, 2014
	};

	struct date day;

	day = today;

	printf ("Today's date is %i-%i-%i. \n",
	        today.year, today.month, today.day);
	printf ("The day's date is %i-%i-%i. \n",
	        day.year, day.month, day.day) ;
	return 0;
}

分析:

  • 输出的两个结果都是一样的
  • 添加上:day.year = 2023;结果会变成:
    image.png
  • 所以说day和today是两个完全不同的结构的变量。
  • 在做:day = today;过程中,day得到了today里所有成员的值

2. 结构指针

  • 和数组不同,结构变量的名字并不是结构变量的地址,必须使用&运算符
  • struct date*pDate=&today;
    • 可以用这条语句定义一个指向结构体的指针,让它取了结构的地址
    • 若去掉了&,编译器会报错,所以结构的名字并不是地址

3. 结构与函数

  • 声明了结构就有了自定义的数据类型,可以作为函数的参数

3.1 结构作为函数参数

例如:

int numberOfdays(struct date d)
  • 整个结构可以作为参数的值传入函数
  • 这时候是在函数内新建一个结构变量,并复制调用者的结构的值
  • 也可以返回一个结构
  • 这与数组完全不同
#include <stdio.h>
#include <stdbool.h>

struct date {
	int month;
	int day;
	int year;
};
bool isLeap(struct date d);
int numberofDays (struct date d);

int main (int argc, char const *argv [] ) {
	struct date today, tomorrow;

	printf ("Enter today's date (mm dd yyyy):");
	scanf ("%i %i %i", &today.month, &today.day, &today.year);

	if (today.day != numberofDays(today)) {
		tomorrow.day = today.day + 1;
		tomorrow.month = today.month;
		tomorrow.year = today.year;
	} else if ( today.month == 12) {
		tomorrow.day = 1;
		tomorrow.month = 1;
		tomorrow.year = today.year + 1;
	} else {
		tomorrow.day = 1;
		tomorrow.month = today.month + 1;
		tomorrow.year = today.year;
	}
	printf ("Tomorrow's date is %i-%i-%i. \n",
	        tomorrow.year, tomorrow.month, tomorrow.day);
	return 0;
}

int numberOfDays (struct date d) {
	int days;
	const int daysPerMonth [12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
	if ( d.month == 2 && isLeap(d))
		days = 29;
	else
		days = daysPerMonth [d.month - 1];
	return days;
}

bool isLeap (struct date d) {
	bool leap = false;
	if ( (d.year % 4 == 0 && d.year % 100 != 0 ) || d.year % 400 == 0 )
		leap = true;
	return leap;
}

分析:

  • isLeap(struct date d);//判断是否是闰年
  • &today.year):取成员优先级高,先去成员,在取地址

输入结构

  • 没有直接的方式可以一次scanf一个结构

输入结构

  • 没有直接的方式可以一次一个结构

如果我们打算直接写一个函数来读入结构

  • 但是读入的结构如何送回来呢?

  • 记住在函数调用时是传值的

    • 所以函数中的与中的是不同的
    • 在函数读入了的数值之后,没有任何东西回到,所以还是

解决的方案

之前的方案,把一个结构传入了函数,然后在函数中操作,但是没有返回回去

问题在于传入函数的是外面那个结构的克隆体,而不是指针传入结构和传入数组是不同的在这个输入函数中,完全可以创建一个临时的结构变量,然后把这个结构返回给调用者

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。