结构与函数的关系

Posted 天“码”行空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构与函数的关系相关的知识,希望对你有一定的参考价值。

思考:能否将结构,结构指针,结构数组作为参数传递给函数,也就是说我们来看看结构与函数有什么样的关系?

一.结构变量作为函数的参数

将结构变量作为参数传递给函数和传递一般变量的机制相同,都是单向值传递不妨我们先看个例子吧。

//将结构类型作为函数参数,输出一个日期的值。
//首先定义一个日期结构类型date,包含年月日信息,然后定义一个函数,功能是输出date类型形参的值。
#include<stdio.h>
typedef struct date  //定义一个结构类型

  int year;
  int month;
  int day;
DATE;            
void PrintDate(DATE a)  //形参为date结构类型的一个结构变量,其接受实参的结构变量

   printf("%d-%d-%d",a.year,a.month,a.day);//注意调用结构成员的方法

int main(void)

   DATE d = 2020,10,30;  //定义一个结构变量,并给它进行初始化
   PrintDate(d);   //调用函数,把结构变量作为函数的参数传递给函数
   return 0;
2020-10-30

对结构变量作为函数参数的总结:【1】在实参和形参之间复制所有结构成员的内容。【2】内容传递直观,但是开销大,特别是结构较复杂时。

刚才那个程序中,被调函数数输出一个日期年月日,思考一下为什么能够输出呢?在main函数中定义结构变量d并且给结构变量初始化,然后结构变量又作为实参传递给形参,形参接收到实参的值的过程,其实是将实参的值复制给形参,然后在被调函数中输出。这个过程与前面一般函数的调用类似。现在思考一下,假设我不是在main函数中定义结构变量时,给结构变量初始化,而是调用一个函数专门给结构变量初始化,试试看能成功吗?

//使用结构作为函数参数,获取一个日期
#include<stdio.h>

typedef struct date

   int year;
   int month;
   int day;
DATE;

void SetDate(DATE a)

   a.year = 2020;
   a.month = 10;
   a.day = 30;


int main(void)

   DATE d;
   SetDate(d);
   printf("%d-%d-%d\\n", d.year, d.month, d.day);
   return 0;
 
35-0-1//垃圾值

为什么显示的不对呢?结合我们前面所学的局部变量的知识可知,main函数调用SetDate函数,调用是为形参分配内存空间,返回时释放内存空间。也就是说被调函数对形参的修改,并没有影响主调函数中实参的值。这一点与我们学习函数调用时单向传递性是一致的。由此可知,结构变量作为函数参数跟普通变量是一样的,形参的改变并不会影响实参的变化。

前面的学习中为了改变实参的值,我们引出了指针的概念(因为指针能够指向实参,从而在实参中对形参的值进行改变)。那么,举一反三,我们也可以将结构指针作为函数参数,达到被调函数对主调函数的操作。

二. 结构指针作为函数参数

从上述运行的程序结果来看,最后输出的是垃圾值。这就表明,被调函数对形参的修改,并没有影响主调函数中实参的值。那么如何通过被调函数修改主调函数中结构变量d呢?很显然,应该使用结构指针。

//结构指针作为函数参数,获取一个日期值
#include<stdio.h>
typedef struct date

   int year;
   int month; 
   int day;
DATE;
void SetDate(DATE *p)  //结构指针作为形参DATE *p; p = &d;即把d的地址赋给指针变量p,换句话
//指针变量p保存的是d的地址,*p 就是指实参中的d

   (*p).year = 2020;
   (*p).month = 10;
   (*p).day = 30;

int main(void)

   DATE d;//定义结构变量d
   SetDate(&d);  //结构变量地址作为实参
   printf("%d-%d-%d", d.year,d.month,d.day);
   return 0;

传递的是结构变量d的地址,被调函数的参数类型由由原来的结构变量改为结构指针。在形参和实参之间传递的是结构变量的地址,而非结构的全部内容,而且能改变主调函数的内容,因此执行效率高,比较常用。

三. 结构作为函数返回值

通过前面的学习我们知道,一般变量作为函数的参数其只有一个返回值。如果我们要得到多个返回值,有一个办法就是通过指针变量作为形参。下面我们再来看个例子:

//定义一个函数,使之返回一个date类型结构,并在main函数中调用
//结构作为函数返回值
#include<stdio.h>

typedef struct date

    int year;
    int month;
    int day;
DATE;

DATE getDate() //DATE即struct date,作为一个函数的返回类型,表明此函数返回DATE类型的结构

   DATE now; //此是连接该函数与结构的关键语句,定义一个date结构类型的结构变量
   now.year = 2020;
   now.month = 11;
   now.day = 03;
   return now;//因now是DATE的结构变量,返回now.year = 2020;now.month = 11;now.day = 03;
 

int main(void)

   struct date oneday;
   
   oneday = getDate();//oneday和now同属DATE,故把now的结构成员的值复制给oneday的结构成员;
   printf("从调用函数中返回的日期是:%d-%d-%d\\n", oneday.year,oneday.month,oneday.day;
   return 0;

因为上述程序是结构作为函数的返回值。下面来总结一下结构作为返回值的一个特点:结构作为函数返回值和普通变量作为函数值的主要区别是可以一次返回多个值,只是这些值被打包为一个结构对象。

以上是关于结构与函数的关系的主要内容,如果未能解决你的问题,请参考以下文章

函数要返回两个值时,主函数的接收要怎么做

顺序存储结构与链式存储结构

函数与宏定义

文本信息抽取与结构化详聊如何用BERT实现关系抽取

第六章:函数与宏定义

Java中的参数传递