结构体和数据结构

您所在的位置:网站首页 返回结构体数组的函数 结构体和数据结构

结构体和数据结构

2024-07-16 22:02:40| 来源: 网络整理| 查看: 265

将结构体传给函数的方式有以下三种:

目录

一、用结构体的单个成员作为函数参数,向函数传递结构体的单个成员

二、用结构体变量作函数实参,向函数传递结构体得完整结构

三、用结构体指针或结构体数组作函数参数,向函数传递结构体的地址。

一、用结构体的单个成员作为函数参数,向函数传递结构体的单个成员

        用单个结构体成员作为函数实参,与普通类型的变量作为函数实参没什么区别,都是传值调用,在函数内部对其进行操作,不会引起结构体成员值得变化。

这种向函数体传递结构体得一个成员得方式,很少使用。

二、用结构体变量作函数实参,向函数传递结构体得完整结构

        用结构体变量作函数实参,向函数传递得是结构体得完整结构,即将整个结构体成员得内容复制给被调函数。在函数内可用成员选择运算符引用其结构体成员。因这种传递方式也是传值调用,所以,在函数内对形参结构体成员值得修改,不会影响相应得实参结构体成员。

        当实参和形参是同一种结构体类型时,才可以使用这种方式传递。当函数被调用时,系统为结构体形参变量分配得存储空间得大小由所定义得结构体类型决定。这种传递方式更直观,但因其占用的内存空间比较大,因而时空开销较大。

三、用结构体指针或结构体数组作函数参数,向函数传递结构体的地址。

    (例题1演示作为函数参数,例题2演示作为函数返回值)

         用指向结构体的指针变量或结构体数组作函数实参的实质是向函数传递给结构体的地址,因为是传地址调用,所以在函数内部对形参结构体成员值得修改,将影响到实参结构体成员的值。

        由于仅复制结构体首地址一个值给被调函数,并不是将整个结构体成员的内容复制给被调函数,因此相对于第2种方式而言,这种传递方式效率更高。

例题1:编写程序用于演示结构体变量作函数参数实现传值调用。

#include struct date { int year; int month; int day; }; void func(struct date p) { p.year=2000; p.month=5; p.day = 22; } int main(void) { struct date d; d.year = 1999; d.month = 4; d.day = 23; printf("Before function call:%d/%02d/%02d\n",d.year,d.month,d.day); func(d); printf("After function call:%d/%02d/%02d\n",d.year,d.month,d.day); return 0; }

可以看出,向函数传递结构体变量时,实际传递给函数的是该结构体变量成员值得副本,这就意味着结构体变量得成员值是不可能在被调函数中被修改的。和其他变量一样,仅当将结构体的地址传递给函数时,结构体变量的成员值才可以在被调函数中被修改。

修改后:

#include struct date { int year; int month; int day; }; void func(struct date *p) { p->year=2000; p->month=5; p->day = 22; } int main(void) { struct date d; d.year = 1999; d.month = 4; d.day = 23; printf("Before function call:%d/%02d/%02d\n",d.year,d.month,d.day); func(&d); printf("After function call:%d/%02d/%02d\n",d.year,d.month,d.day); return 0; }

 

例题2:结构体除了可作为函数参数的类型意外,还可作为函数返回值的类型。

#include struct date { int year; int month; int day; }; struct date Func(struct date p) { p.year=2000; p.month = 5; p.day = 29; return p; } int main(void) { struct date d; d.year = 1999; d.month = 4; d.day = 23; printf("Before function call:%d/%02d/%02d\n",d.year,d.month,d.day); d = Func(d); printf("After function call:%d/%02d/%02d\n",d.year,d.month,d.day); return 0; }

例题3:使用结构体数组所函数参数编程并输出计算学生的平均分。

#include #define N 30 typedef struct date { int year; int month; int day; }DATE; typedef struct student { long studentID; char studentName[10]; char studentSex; DATE birthday; int score[4]; }STUDENT; void InputScore(STUDENT stu[],int n,int m); void AverScore(STUDENT stu[],float aver[],int n,int m); void PrintScore(STUDENT stu[],float aver[],int n,int m); int main(void) { float aver[N]; STUDENT stu[N]; int n; printf("How many student?"); scanf("%d",&n); InputScore(stu,n,4); AverScore(stu,aver,n,4); PrintScore(stu,aver,n,4); return 0; } void InputScore(STUDENT stu[],int n,int m) { int i,j; for(i=0;i


【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭