C语言的3种参数传递方式

2017年09月14日 18:30:26 采香行处 阅读数:14619

                                                                                                                       </div><div class="operating"></div></div></div>
</div>
<article class="baidu_pl"><div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post"><div class="article-copyright"><svg class="icon" title="CSDN认证原创" aria-hidden="true" style="width:53px; height: 18px; vertical-align: -4px;"><use xlink:href="#CSDN_Cert"></use></svg>版权声明:本文为博主原创文章,未经博主允许不得转载。                  https://blog.csdn.net/u013097971/article/details/77983810               </div><link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css"><div id="content_views" class="markdown_views"><!-- flowchart 箭头图标 勿删 --><svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg><p>参数传递,是在程序运行过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程,方法有3种方式</p>

  • 值传递
  • 地址传递
  • 引用传递

tips:

  1. 被调用函数的形参只有函数被调用时才会临时分配存储单元,一旦调用结束占用的内存便会被释放
  2. 值传递和地址传递,传递的都是实参的一个拷贝
  3. C语言中实参和形参之间的数据传递是单向的“值传递”,单向传递,只能由实参传给形参,反之不行
  4. 输出格式并没有选择%p而是选择了%d,因为十进制的数看起来更直观

值传递

  • 如果只是传递值的话:
#include <stdio.h>//值传递传值
void swap( int x, int y);
int main()
{int a=2,b=3;printf("before:实参为a,b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);swap(a,b);printf("after:实参为a,b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);return 0;
}
void swap(int x,int y)
{int tmp;tmp=x;x=y;y=tmp;printf("inside:形参为x,y\nx=%d,地址为%d\ny=%d,地址为%d\n\n",x,&x,y,&y);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

执行结果:

  • 如果传递的是地址呢?
#include <stdio.h>//值传递传地址
void swap( int *x, int *y);
int main()
{int a=2,b=3;printf("before:实参为&a,&b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);swap(&a,&b);printf("after:实参为&a,&b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);return 0;
}
void swap(int *x,int *y)
{int *tmp= NULL;tmp=x;x=y;y=tmp;printf("inside:形参为*x,*y\n*x=%d,x=%d,地址为%d\n*y=%d,y=%d,地址为%d\n\n",*x,x,&x,*y,y,&y);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

执行结果:

地址传递

#include <stdio.h>//地址传递
void swap( int *x, int *y);
int main()
{int a=2,b=3;printf("before:实参为&a,&b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);swap(&a,&b);printf("after:实参为&a,&b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);return 0;
}
void swap(int *x,int *y)
{int tmp;tmp=*x;*x=*y;*y=tmp;printf("inside:形参为*x,*y\n*x=%d,x=%d,地址为%d\n*y=%d,y=%d,地址为%d\n\n",*x,x,&x,*y,y,&y);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

执行结果为:

引用传递

#include <stdio.h>//引用传递
void swap( int &x, int &y);
int main()
{int a=2,b=3;printf("before:实参为a,b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);swap(a,b);printf("after:实参为a,b\na=%d,地址为%d\nb=%d,地址为%d\n\n",a,&a,b,&b);return 0;
}
void swap(int &x,int &y)
{int tmp;tmp=x;x=y;y=tmp;printf("inside:形参为&x,&y\nx=%d,地址为%d\ny=%d,地址为%d\n\n",x,&x,y,&y);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

执行结果为:

补充

int x=1;
int *y=&x; //用于指针传递,y有自己独立的内存地址,存储的内容是x的地址,*y是x的值
int &z=x; //用于引用传递,可以理解为z就是x,x就是z,只不过名字不一样
  • 1
  • 2
  • 3
                 <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-258a4616f7.css" rel="stylesheet"></div>
</article>

C语言的三种参数传递方式相关推荐

  1. C++中函数调用时的三种参数传递方式(x,*x,x)

    先看三种方式实现函数中参数传递的实例程序 输入描述:两个待交换的整数 程序输出:交换后得按值传递两个整数 (一)按值传递:按值传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空 ...

  2. Fortran三种数组传递方式

    本文介绍了假定大小,假定形状,自动数组三种数组传递方式,并对比了其中的差别和优劣.适合新手阅读 Fortran 中,调用函数或子程序时,默认将实参的地址传递给形参,称为地址传递或引用传递.究其原因,是 ...

  3. range函数python三个参数_range()函数三种参数的用法

    第8篇分享 range()是python的内置函数,用的地方挺多的,目前我经常会在for循环中作为循环的次数来使用,其实range()的用法不仅仅如此,本文给大家介绍下range()函数的三种参数的基 ...

  4. 固本培元之三:Convert、运算符、流程控制语句、ref/out/in三种参数类型

    一.Convert类常用的类型转换方法 Convert.ToInt32() 转换为整型(int) Convert.ToChar() 转换为字符型(char) Convert.ToString() 转换 ...

  5. c语言属于结构化程序设计语言,c语言填空题1.结构化程序设计语言的三种基本结构分别是,和.-查字典问答网...

    c语言填空题 1.结构化程序设计语言的三种基本结构分别是,和. 2.C源程序的基本单位是______,一个C源程序中至少应包括一个______. 3.开发一个C程序要经过编辑.__________.连 ...

  6. [经验] 轻松解读PID控制算法的三种参数的自整定方法

    轻松解读PID控制算法的三种参数的自整定方法 - 机器人论坛 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com)

  7. c语言的三种基本结构——初学者一定要了解哦

    文章目录 前言 一.顺序结构 二.选择结构(分支语句) 1.选择语句之→if语句 1.1 if语句的基本结构 1.2 if语句之多分支: 1.3 if语句的常见错误使用. 2.选择语句之→switch ...

  8. ASP.NET MVC:多语言的三种技术处理策略

    背景 本文介绍了多语言的三种技术处理策略,每种策略对应一种场景,这三种场景是: 多语言资源信息只被.NET使用. 多语言资源信息只被Javascript使用. 多语言资源信息同时被.NET和Javas ...

  9. C语言中三种大括号格式的规范

    C语言中三种大括号格式的使用规范 简介: 在C中,使用大括号的方法无所谓对还是错--只要每个开括号后都有一个闭括号,你的程序中就不再会出现与大括号有关的问题.然而,有三种著名的大括号格式:Kernig ...

最新文章

  1. java treemap 内存_Java中Map、HashMap、LinkedHashMap、TreeMap的区别
  2. OpenID 和 OAuth 的区别及第三方登录的安全隐患分析
  3. JmsTemplate sendAndReceive 设置超时
  4. 计算机网络选择重传,计算机网络选择重传协议实验报告..docx
  5. python怎么创建子类_Python:如何在创建时使用父类注册所有子类
  6. 基本定时器TIM6和TIM7使用
  7. paper reading:[renormalization]Semi-supervised Classification with Graph Convolutional Networks
  8. 数据仓库中OLTP和OLAP的区别
  9. 高级API 快速入门之第八章 多线程02
  10. CSS 中文字体格式
  11. python爬虫 微信公众号模拟登陆js解密
  12. BZOJ4134 ljw和lzr的hack比赛
  13. 岁月的感知,生命的守望
  14. 强化学习萨顿和巴托部分习题
  15. 红米Note9Pro和红米Note9ProMax哪个好-区别是什么
  16. echarts饼图设置每个扇形的颜色
  17. 二叉树的创建——递归与非递归
  18. spring cloud 快速上手系列 -> 02-配置中心 Config -> 022-Config客户端
  19. Leetcode LCP2.分式化简
  20. Linux下 SpeedTest 工具测速

热门文章

  1. python无法启动0xc0000022_无法正常启动0xc0000022_0xc0000022一键修复教程 - 系统家园...
  2. SAP中的采购质量管理与订单及收货控制
  3. nas网络存储服务器性能要求,NAS系统的优缺点全面介绍
  4. python中wxpy的应用
  5. 【CRR-FMM】A Concise Review of Recent Few-shot Meta-learning Methods
  6. 实现strncmp()函数
  7. strncmp函数的简单用法
  8. 全面发展还是术业专攻?这就是答案
  9. ROI Pooing
  10. 流量卡之家:智慧矿山开启5G时代 联通助推能源产业发展新纪元