一、首先需要引入函数中的实际参数与形式参数

实际参数(实参)是指真实传给函数的参数。实参可以是常量、变量、表达式、函数等,无论实参是何种类型的数据,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

形式参数(形参)是指函数名后括号中的变量。因为形式参数只有在函数被调用的过程中才会分配内存单元,调用结束后,立刻释放内存(形参只在函数中有效),所以叫形式参数。

通过一个例子来加深理解:

如以下加法程序中,ADD()函数中的参数x、y为形参,在main函数中传给ADD函数的a、b为实参

#include <stdio.h>
int ADD(int x, int y)
{int z = x + y;return z;
}int main()
{int a = 1;int b = 2;int sum = ADD(a, b);printf("%d", sum);return 0;
}

1、 在main函数中ADD()函数调用前,已经定义了参数a、b的确定值,即系统给参数a、b分配了内存单元;而此时由于函数未被调用,系统并不会给x、y分配内存。通过在编译器中监视这四个参数以及这四个参数的地址可以非常直观地看出。

2、当ADD()函数被调用时,系统会给参数x、y分配内存单元,并将a、b的值传给x、y。

可以简单得认为:形参是函数调用后,对实参内容的一个临时拷贝。

二、函数中的传值调用与传址调用

那么函数内改变x、y的值是否会改变main函数中a、b的值呢?

请看下面这个程序并给出a、b的值

#include <stdio.h>
void Swap1(int x, int y)
{int tmp = 0;                   tmp = x;                        x = y;y = tmp;
}
int main()
{int a = 1;int b = 2;Swap1(a, b);printf("a = %d b = %d\n", a, b);return 0;
}

.....

.....

.....

答案是a=1 b=2

这是因为函数的形参和实参分别占有不同内存块,即它们的地址不同,对形参的修改不会影响实参。这是函数传值调用的特点。

传值调用便是如上述两个程序所示,是指直接将实参的值传给形参。

那么要如何更改程序,才能使函数具有交换a、b的值的功能呢?

在函数中,除了直接将实参的值传给形参,还可以通过实参的地址获得实参的值。

可以把实参的内存地址传递给形参,在函数内部通过解引用操作符(*)改变内存地址所存储的值,这便是传址调用

#include <stdio.h>
void Swap2(int *px, int *py)
{int tmp = 0;tmp = *px;                       *px = *py;*py = tmp;
}
int main()
{int a = 1;int b = 2;Swap2(&a, &b);printf("a = %d b = %d\n", a, b);return 0;
}

总结:

1.传值调用是指直接将实参的值传给形参。而形参和实参分别占有不同内存块,对形参的修改不会影响实参。

2.传址调用是把实参的内存地址传递给形参的一种调用函数的方式。这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接改变实参的值。

简单了解函数的传值调用与传址调用(C语言)相关推荐

  1. 【 C 】函数参数通过传值调用还是传址调用?

    C 函数的所有参数均以 "传值调用" 方式进行传递,这意味着函数将获得参数值的一份拷贝.这样函数就可以放心修改这个拷贝值,而不必担心会修改调用程序实际传递给它的参数. 既然调用函数 ...

  2. 函数的调用(传值调用和传址调用)

    传值调用 函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参. 传址调用 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式. 这种传参方式可以让函数和函数外边的变量建 ...

  3. 手写C语言之函数概念-函数分类-实参与形参-传值调用与传址调用介绍(11)

    目录 函数是什么? C语言中函数的分类 库函数 自定义函数 写一个函数可以找出两个整数中的最大值. 交换整型变量的函数 函数的参数 实际参数(实参) 形式参数(形参) 函数的调用 传值调用 传址调用 ...

  4. 函数学习笔记(一) 传值调用、传址调用.

    前言  函数是程序的一个子程序,自己定义的函数与主函数的地位·相同. 函数分为: 库函数.自定义函数 一.库函数 在学习函数之前我们就有接触到了函数--库函数 比如说printf.scanf.getc ...

  5. 前端:JS/22/函数(函数的概念,函数的定义格式,函数定义格式的说明,函数的调用,函数的参数),全局变量和局部变量,拷贝传值和引用传址,匿名函数,二维数组,对象,自定义对象的创建

    函数 1,函数的概念 函数,是将一段公共的代码进行封装,给它起个名字叫"函数" 函数可以一次定义,多次调用:函数可以将常用的功能代码,进行封装,如:用户名的验证,验证码函数,邮箱验 ...

  6. JavaScript 是传值调用还是传引用调用?

    1. 例子 先来看两个个来自于 <JavaScript 高级程序设计>P70-P71 的两个例子. 1.1. 基本类型参数传递 function addTen(num) {num += 1 ...

  7. JavaScript 函数参数是传值(byVal)还是传址(byRef)?

    对于"JavaScript 函数参数是传值(byVal)还是传址(byRef)"这个问题,普遍存在一个误区:number,string等"简单类型"是传值,Nu ...

  8. Java中的形参和实参的区别以及传值调用和传引用调用

    名词解析: 1.形参:用来接收调用该方法时传递的参数.只有在被调用的时候才分配内存空间,一旦调用结束,就释放内存空间.因此仅仅在方法内有效. 2.实参:传递给被调用方法的值,预先创建并赋予确定值. 3 ...

  9. 传值调用 与传地址调用(传引用)

    转自:http://myturn.blog.hexun.com/15584978_d.html #include <iostream> using namespace std ; void ...

最新文章

  1. [C++] 为什么Linux需要itoa函数
  2. 微信小程序 - vant popup弹出层阻止底层页面滑动
  3. c 用户控件 多语言,多语言文本控件重叠解决方案
  4. 芯片电源引脚的电容选择
  5. mysql扩展中如何处理结果集_请写出PHP处理结果集的5个函数(使用mysql扩展)_学小易找答案...
  6. JavaScript函数—JavaScript闭包
  7. Spring security3入门(转)
  8. 关于MCNS/DOCSIS兼容RF接口的RF接口MIB
  9. pythonfor杨辉三角,python实现杨辉三角 python实现杨辉三角的几种方法代码实例
  10. Pandas数据处理与分析
  11. 计算机word降序排列怎么做,WORD表格怎么按照数字降序排列
  12. Android图片轮播控件 如果对你有帮助请star哦!
  13. 史上最全!数据分析进阶教程,看这一篇就够了!
  14. iOS 3DTouch 代码实现
  15. 机器学习中的过拟合与欠拟合
  16. XTU 1249 Rolling Variance
  17. 微信小程序(上传照片功能、统计字数功能)
  18. 数值分析实验 实验3-1 牛顿下山法 python3实现
  19. 全国计算机一级考试用什么版本,计算机等级考试用的是那个版本的office?
  20. VCS+Verdi ubuntu18.04安装教程

热门文章

  1. 中国式家长怎么学计算机,中国式家长前期怎么学习 中国式家长前期学习攻略...
  2. (附源码)计算机毕业设计JavaJava毕设项目蛋糕店会员系统
  3. 瀑布流ajax思路步骤,原生ajax瀑布流demo分享(必看篇)
  4. 【机器视觉运动控制一体机小课堂】三分钟进行灰度匹配
  5. 什么是苹果推信?什么是苹果推?
  6. 量化交易入门阶段:KDJ指标能否到底怎么样?
  7. 基于JAVA家教信息计算机毕业设计源码+数据库+lw文档+系统+部署
  8. 独立开发者回顾自身失败经历及其教训
  9. 少儿学习编程课程是否真的适合七八岁的低龄儿童[图]
  10. C# 5.0功能之Async一瞥