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

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

结构体作为参数

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

情形1

#include<stdio.h>

#include<string.h>

struct namect{

char fname[20];

char lname[20];

int letters;

};

struct namect getinfo(void);

struct namect makeinfo(struct namect);

void showinfo(struct namect);

int main(void)

{

struct namect person;

person=getinfo();

person=makeinfo(person);

//makeinfo(person);

showinfo(person);

return 0;

}

struct namect  getinfo(void)

{

struct namect temp;

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

gets(temp.fname);

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

gets(temp.lname);

return temp;

}

struct namect makeinfo(struct namect info)

{

info.letters=strlen(info.fname)+strlen(info.lname);

return info;

}

void showinfo (struct namect info)

{

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

}

程序的运行结果图如下:

情形2

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

结构体指针作为参数

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

#include<stdio.h>

#include<string.h>

struct namect{

char fname[20];

char lname[20];

int letters;

};

struct namect getinfo(void);

void  makeinfo(struct namect *pst);

void showinfo(struct namect);

int main(void)

{

struct namect person;

person=getinfo();

//person=makeinfo(person);

//makeinfo(person);

makeinfo(&person);

showinfo(person);

return 0;

}

struct namect  getinfo(void)

{

struct namect temp;

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

gets(temp.fname);

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

gets(temp.lname);

return temp;

}

void makeinfo(struct namect *pst)

{

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

}

void showinfo (struct namect info)

{

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

}

程序运行结果如下:

在情形二与情形一比较,虽然表面上看起来情形二调用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限制,传递结构值是处理小型结构经常用到的方法,通常传递指针或只将所需的成员作为参数传递。

结构体、结构指针作为函数参数相关推荐

  1. C语言项目实战:24点游戏计算器(基于结构体、指针、函数、数组、循环等知识点)

    文章目录 C语言项目实战:24点游戏计算器(基于结构体.指针.函数.数组.循环等知识点) 前言:24点游戏计算器的规则如下 一.项目的创建标 1.选择项目 2.输入项目名称和路径 3.创建头文件Mai ...

  2. C 语言结构体数组指针以及函数

    结构体数组指针 指针变量可以指向一个结构体数组,这时指针变量的值是整个数组的首地址. 设 ps 为指向结构体数组的指针变量,则 ps 也指向该结构体数组的第 0个元素,ps+1 指向第一个元素,ps+ ...

  3. 11(2).结构体的存储方式,结构体变量和结构体变量指针作为函数参数传递的问题,指针的优点

    本人坚持更新C语言和数据结构知识,可以收藏+关注随时了解

  4. JNA实战笔记汇总(二)——JNA和C / C ++的数据类型映射(dll函数回调、结构体、指针)

    目录 JNA技术难点 1.函数回调 2.结构体 3.指针 JNA技术难点 有过跨平台.跨语言开发的程序员都知道,跨平台.预研调用的难点,就是不同语言之间数据类型不一致造成的问题.绝大部分跨平台调用的失 ...

  5. C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例

    C++ 基础入门 之 结构体/结构体定义和使用/结构体数组/结构体指针/ 结构体嵌套结构体/结构体做函数参数/结构体中 const 使用场景/结构体案例 目录 一.简单介绍 二.结构体定义和使用 三. ...

  6. 【C 语言】结构体 ( 结构体作为函数参数 | 结构体指针作为函数参数 )

    文章目录 一.结构体作为函数参数 二.结构体指针作为函数参数 三.完整代码示例 一.结构体作为函数参数 结构体变量 作为函数形参 , 在函数中 , 只能访问 该函数形参 , 无法修改 结构体内存 的值 ...

  7. C++结构体 结构体定义和使用、结构体数组、结构体指针、结构体嵌套结构体、结构体做函数参数

    C++结构体 第二章 C++结构体 1.结构体定义和使用 语法:struct 结构体名 { 结构体成员列表 }: 通过结构体创建变量的方式有三种: struct 结构体名 变量名 struct 结构体 ...

  8. 结构体和结构体指针作为函数参数的区别

    0·说明 文章里的观点来自网络的总结,程序经过自己的验证,在VC6.0中可正常执行. 1.测试程序 /* ##结构体指针与结构体变量用作函数参数区别:##结构体指针作为函数参数时,调用时传递的是指向一 ...

  9. 【C 语言】结构体 ( 结构体 数组 作为函数参数 | 数组 在 堆内存创建 )

    文章目录 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 二.完整代码示例 一.结构体 数组 作为函数参数 ( 数组 在 堆内存创建 ) 在上一篇博客 [C 语言]结构体 ( 结构体 数 ...

最新文章

  1. python注入_python的常见命令注入威胁
  2. 如何打造一个经常宕机的业务系统?
  3. LINUX利用Speedtest测速
  4. [YTU]_2919( Shape系列-5)
  5. 检查CentOS7定时任务是否启用并执行过
  6. 298. Binary Tree Longest Consecutive Sequence
  7. WebBenchmark动态测试Webapi
  8. ZOJ 2562 More Divisors
  9. powerdesigner mysql 自增主键_PowerDesigner Mysql 主键自增、初始值、字符集
  10. 发际线预警!10本程序员必读烧脑经典,你敢挑战一本吗?
  11. bootstap-栅格系统
  12. springboot 不使用 thymeleaf_springboot 使用swagger 不显示basic-error-controller解决
  13. 华为前员工李洪元:我的诉求只有见任总能解决;音悦台被传倒闭;.NET Core 3.1 发布 | 极客头条...
  14. web渗透测试中WAF绕过讲解(二)基于HTTP协议绕过
  15. 国外字体设计师也是蛮重视数学的
  16. Java 安装包下载地址
  17. 转正述职报告 实习转正 工作汇报 述职模板免费下载_PPTX图片设计素材_包图网888pic.com...
  18. 利用Python查询IP地址
  19. 日语“不要”有几种说法。
  20. 在子页面控制父页面iframe的高度

热门文章

  1. 达拉斯牛仔队门票的球队发挥其主场比赛在牛仔体育场在阿灵顿
  2. linux 网桥迁移命令,Linux 网桥配置命令: brctl
  3. Numpy的数据类型
  4. 微型计算机标准配置的输入设备是什么,2013年计算机一级MsOffice模拟试题及答案25...
  5. 【MATLAB】MATLAB 结构体
  6. 时间戳格式转换Date类型
  7. 【实用篇】Python操作PDF文件
  8. html标签路径,HTML图片标签路径解析
  9. 信号与系统(一):响应的分类和联系(通解、特解,暂态、稳态,零输入、零状态)、稳定性、传递函数
  10. 通俗易懂讲解均方误差 (MSE)