结构体、结构指针作为函数参数(有区别)

结构体、结构指针作为函数参数

结构体、结构体指针作为函数的参数现在应用的非常广泛,但一些细微之处还需要引起注意。本文将讨论其作为形参实参的区别。

结构体作为参数

结构体作为函数的参数,目的是通过makeinfo()函数调用去改变person结构体中letters的值。

情形1

#include<stdio.h>

#include<string.h>

struct namect{

�0�2�0�2�0�2 char fname[20];

�0�2�0�2�0�2 char lname[20];

�0�2�0�2�0�2 int letters;

};

struct namect getinfo(void);

struct namect makeinfo(struct namect);

void showinfo(struct namect);

int main(void)

{

�0�2�0�2�0�2 struct namect person;

�0�2�0�2�0�2 person=getinfo();

�0�2�0�2�0�2 person=makeinfo(person);

�0�2�0�2�0�2 //makeinfo(person);

�0�2�0�2�0�2 showinfo(person);

�0�2�0�2�0�2 return 0;

}

struct namect�0�2 getinfo(void)

{

�0�2�0�2�0�2 struct namect temp;

�0�2�0�2�0�2 printf("please enter you first name.\n");

�0�2�0�2�0�2 gets(temp.fname);

�0�2�0�2�0�2 printf("please enter you last name.\n");

�0�2�0�2�0�2 gets(temp.lname);

�0�2�0�2�0�2 return temp;

}

struct namect makeinfo(struct namect info)

{

�0�2�0�2�0�2 info.letters=strlen(info.fname)+strlen(info.lname);

�0�2�0�2�0�2 return info;

}

void showinfo (struct namect info)

{

�0�2�0�2�0�2 printf("%s %s ,your name contains %d letters .\n",info.fname,info.lname,info.letters);

}

程序的运行结果图如下:

https://img-blog.csdn.net/20150905161616908

情形2

如果将person=makeinfo(person)改为makeinfo(person),则运行结果如下:

https://img-blog.csdn.net/20150905161005090

结构体指针作为参数

结构体指针作为函数的参数,从而直接去改变letters的值,相关代码如下:

#include<stdio.h>

#include<string.h>

struct namect{

�0�2�0�2�0�2 char fname[20];

�0�2�0�2�0�2 char lname[20];

�0�2�0�2�0�2 int letters;

};

struct namect getinfo(void);

void�0�2 makeinfo(struct namect *pst);

void showinfo(struct namect);

int main(void)

{

�0�2�0�2�0�2 struct namect person;

�0�2�0�2�0�2 person=getinfo();

�0�2�0�2�0�2 //person=makeinfo(person);

�0�2�0�2�0�2 //makeinfo(person);

�0�2�0�2�0�2 makeinfo(&person);

�0�2�0�2�0�2 showinfo(person);

�0�2�0�2�0�2 return 0;

}

struct namect�0�2 getinfo(void)

{

�0�2�0�2�0�2 struct namect temp;

�0�2�0�2�0�2 printf("please enter you first name.\n");

�0�2�0�2�0�2 gets(temp.fname);

�0�2�0�2�0�2 printf("please enter you last name.\n");

�0�2�0�2�0�2 gets(temp.lname);

�0�2�0�2�0�2 return temp;

}

�0�2void makeinfo(struct namect *pst)

{

�0�2�0�2�0�2 pst->letters=strlen(pst->fname)+strlen(pst->lname);

}

void showinfo (struct namect info)

{

�0�2�0�2�0�2 printf("%s %s ,your name contains %d letters .\n",info.fname,info.lname,info.letters);

}

程序运行结果如下:

https://img-blog.csdn.net/20150905161616908

在情形二与情形一比较,虽然表面上看起来情形二调用makeinfo(person)函数后,好像改变了person结构体中letters的值。但实质上调用makeinfo(person)函数中,结构体person只是作为一个形式参数,函数会创建一个新的结构体**info,person中的值被复制到新的info结构体中,之后函数的所有处理过程都是针对这个**info结构体副本。自然而然得到的 letters的值只是存储在info中,而没有存在person结构体中。这就是为什么我们看到Letters是一个随机值的原因。

结构体指针作为函数的参数,因为传送的实质就是person结构体的地址,也就是person结构体本身。makeinfo(&person)函数调用,通过使用指针pst定位把计算得到的值放在person结构体中,当然能改变其中letters的值。

我们可以用形参实参来类比理解,传结构体相当于一个形参(形式上的参数,只是起到一个复印件的作用,之后的处理都是针对其复印件而言,要想改变实参原件必须对实参原件进行重新赋值更改,而在调用的函数中对形参的赋值,改变不会影响外部的实参,他只是对复印件的改变),传结构体指针相当于一个实参(实实在在的参数,一般是传输相关参数的地址值,改变都是对它本身而言)。

结构作为参数的优点

  1. 编程风格更加的直接、清晰。
  2. 由于其改变的是副本,所以比处理原始数据相比更加的安全。

结构体指针作为参数的优点

  1. 只需要传递一个单个地址即可;
  2. 处理数据更加的方便,效率较高。

但是两者也有各自的缺点,结构作为参数有时候比较浪费空间时间,结构体指针缺少对数据的保护。

通常,为追求效率常使用结构指针作为参数,当需要保护现场或者为发生某些不必要的意外时候使用const限制,传递结构值是处理小型结构经常用到的方法,通常传递指针或只将所需的成员作为参数传递。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值