结构体和数据结构--向函数传递结构体

这篇具有很好参考价值的文章主要介绍了结构体和数据结构--向函数传递结构体。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

目录

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

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

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


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

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

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

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

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

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

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

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

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

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

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

#include <stdio.h>

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;
}

如何将结构体变量传入成员函数里,c语言学习,数据结构,c++

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

修改后:

#include <stdio.h>

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;
}

 如何将结构体变量传入成员函数里,c语言学习,数据结构,c++

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

#include <stdio.h>
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 <stdio.h>
#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<n;i++)
	{
		printf("Input record %d:\n",i+1);
		scanf("%ld",&stu[i].studentID);
		scanf("%s",stu[i].studentName);
		scanf(" %c",&stu[i].studentSex);
		scanf("%d",&stu[i].birthday.year);
		scanf("%d",&stu[i].birthday.month);
		scanf("%d",&stu[i].birthday.day);
		for(j=0;j<m;j++)
		{
			scanf("%d",&stu[i].score[j]);
		}
	}
}

void AverScore(STUDENT stu[],float aver[],int n,int m)
{
	int i,j,sum[N];
	for(i=0;i<n;i++)
	{
		sum[i]=0;
		for(j=0;j<m;j++)
		{
			sum[i]=sum[i]+stu[i].score[j];
		}
		aver[i]=(float)sum[i]/m;
	}
}

void PrintScore(STUDENT stu[],float aver[],int n,int m)
{
	int i,j;
	printf("Reaults: \n");
	for(i=0;i<n;i++)
	{
		printf("%10ld%8s%3c%6d/%02d/%02d ",stu[i].studentID,
                                            stu[i].studentName,
                                            stu[i].studentSex,
                                            stu[i].birthday.year,
                                            stu[i].birthday.month,
                                            stu[i].birthday.day);
		for(j=0;j<m;j++)
		{
			printf("%4d",stu[i].score[j]);
		}
		printf("%6.lf\n",aver[i]);
	}
}

如何将结构体变量传入成员函数里,c语言学习,数据结构,c++文章来源地址https://www.toymoban.com/news/detail-760506.html

到了这里,关于结构体和数据结构--向函数传递结构体的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【HarmonyOS】轻量级智能穿戴应用如何在页面中实现数据传递与全局变量的使用

    【】 轻量级智能穿戴、LiteWearable、数据传递、全局变量 【问题描述】 开发轻量级智能穿戴LiteWearable应用,在app.js中定义全局变量,在页面中通过this.$app.$def.xxx获取时,报错TypeError: Cannot read property \\\'$def\\\' of undefined 【问题分析】 经确认,LiteWearable暂不支持$def,只要是轻

    2024年02月03日
    浏览(39)
  • C语言自定义数据类型(一)定义和使用结构体变量

    C 语言提供了一些由系统已定义好的数据类型,如:int,float,char  等,用户可以在程序中用它们定义变量,解决一般的问题。 但是人们要处理的问题往往比较复杂,只有系统提供的类型还不能满足应用的要求,C语言允许用户根据需要自己建立一些数据类型,并用它来定义变

    2024年02月02日
    浏览(36)
  • 数据结构8 散列函数

    1-1 分数 1 作者 DS课程组单位 浙江大学 Store M elements in a hash table which is represented by an array of size S , the loading density is then M / S . 将M个元素存储在哈希表中,哈希表由大小为S的数组表示,则加载密度为M/S。 T F 1-2 分数 1 作者 冯雁单位 浙江大学 In hashing, functions \\\"insert\\\" and \\\"find\\\" h

    2024年02月07日
    浏览(43)
  • 数据结构——散列函数、散列表

    散列表的基本概念 散列函数的构造方法 处理冲突的方法 散列查找及性能分析 提示:以下是本篇文章正文内容,下面案例可供参考 概念:之前的算法建立在“比较”基础上,效率取决于比较次数 散列函数:将映射成该对应地址的函数,记为Hash(key)=Addr,散列函

    2024年02月07日
    浏览(32)
  • 【数据结构】二叉树-堆(函数实现)

     🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343 🔥 系列专栏: 《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm=1001.2014.3001.5482 ​​   目录 头文件 函数实现 初始化 销毁 插入 向上调整 交换两个元素 向下调整 删除(默认删堆顶元素) 找堆顶元素 堆的

    2024年01月22日
    浏览(35)
  • 数据结构Pta训练题函数题详解

    感谢你这么帅(漂亮)​还支持我 pta网站:PTA | 程序设计类实验辅助教学平台 (pintia.cn) 文章内容较长,建议搭配目录使用 给定一个顺序存储的线性表,请设计一个函数删除所有值大于min而且小于max的元素。删除后表中剩余元素保持顺序存储,并且相对位置不能改变。 函数接

    2024年02月12日
    浏览(37)
  • 数据结构 —— 双向链表(超详细图解 & 接口函数实现)

    数据结构 —— 顺序表 数据结构 —— 单链表 数据结构 —— 双向链表 数据结构 —— 队列 数据结构 —— 栈 数据结构 —— 堆 数据结构 —— 二叉树 数据结构 —— 八大排序 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元

    2024年02月11日
    浏览(31)
  • 【算法与数据结构】28、LeetCode实现strStr函数

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :首先判断字符串是否合法,然后利用for循环,取出子字符串利用compare函数进行比较。    程序如下 : 复杂度分析: 时间复杂度: O ( n ∗ m ) O(n * m) O ( n ∗ m ) ,假设haystack的长

    2024年02月12日
    浏览(33)
  • C#学习笔记--复杂数据类型、函数和结构体

    特点:多个数据变量地一个集合体,可以自己命名 种类:枚举、数组和结构体 枚举:整型常量的集合 数组:任意变量类型的顺序存储的数据集合 结构体:任意变量类型的数据组合成的数据块 枚举 : 枚举可以方便表示对象的各种状态,本质还是一种变量。 例如我们可以用

    2024年02月08日
    浏览(35)
  • MATLAB 之 常用内部函数,运算,字符串和结构数据与单元数据

    内部函数是由 MATLAB 系统根据一般用户的需要编制并提供给用户使用的一组程序,也被称为系统函数或库函数。 MATLAB 提供了许多数学函数,函数的自变量规定为矩阵变量,运算法则是将函数逐项作用于矩阵的元素上,因而运算的结果是一个与自变量具有相同维数和大小的矩阵

    2024年02月04日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包