int add(int a, int b)   //函数传参的时候使用了int整型数据,本身是数值类型。实际调用该函数时,实参将自己拷贝一份,并将拷贝传递给形参进行运算。实参自己实际是不参与运算的。所以在该函数中,实参本身是没有得到改变的。

int main()

{

  int x = 3, y = 5;

swap(x, y);

  printf("x = %d ,y = %d\n",x, y);  //交换失败

swap_pointer(&x, &y);

  printf("x = %d ,y = %d\n",x, y);  //交换成功

}

int swap(int a, int b)     //C语言中,函数调用时,实参传递给形参实际是传值调用。也就是说,实参x和y将自己的值拷贝一份传给形参 a 和 b;因此在函数swap中实际得到交换的是 a 和 b,而不是实参 x 和 y,因此函数执行完后,x和y的值依然没有改变。

{

  int temp;

  temp = a;     //a是swap里边的形参,实际调用时得到的是实参x的一份拷贝,只是和x的值相等而已,其他并无任何关联,因此在这里不能访问到实参x

a = b;

  b = temp;

  return 0;

}

int swap_pointer(int *p1, int *p2)   //C语言函数调用时,一直都是传值调用。也就是说实际传递的一直都是实参的拷贝,但是在本函数中的形参和实参都不是x和y,而是x和y的地址值。这样的话,就让我们在调用函数里通过间接访问*p的方式,访问到了函数外部的实参。                                                      //(如果不使用指针,再调用函数内部只能访问到形参,无法访问到函数外部的实参)

{

  int temp;

  temp = *p1;     //实际调用时,p1得到的实参是x的地址&x,所以*p1代表的就是x

*p2 = *p1;

*p1 = temp;

return 0;

}

转载于:https://www.cnblogs.com/jiangtongxue/p/11079651.html

C语言 指针在函数传参中的使用相关推荐

  1. 【C语言进阶】数组、指针、函数——传参篇

    目录 写在前面 一.数组传参 一维数组传参 二维数组传参 二.指针参数 一级指针传参 二级指针传参 三.函数传参 四.看懂代码 写在最后 写在前面 上篇文章介绍了指针数组和数组指针,有兴趣的小伙伴可以 ...

  2. 深入理解C语言系列之函数传参的那些事儿(函数参数、指针、地址、数组)

    文章目录 一.指针与函数之间的关系 二.复制传参 三.地址传参 四.传一维数组(地址) 五.传二维数组(地址) 六.传指针数组(地址) 七.指针函数和函数指针 一.指针与函数之间的关系 1.我们可以给 ...

  3. 指针在函数传参的使用

    首先函数有形参和实参之分,形参是在函数原型和函数定义中写的参数,实参是在实际调用函数时的参数 调用函数的过程:将实参压栈,在栈内存空间中重新创建以形参为编译地址的空间,值为实参传递,(这里就说明了为什 ...

  4. linux-c之函数(函数指针、函数传参、命令行参数)

    一.函数的定义与声明.调用 #include <stdio.h>int add(int a,int b);//函数声明int main() {int a = 5;int b= 6;int ...

  5. C语言指针与函数传参

    指针与函数传参 普通变量与函数形参 数组作为函数形参 结构体变量作为函数形参 传值调用和传址调用 输入型参数和输出型参数 函数的形参和返回值 函数传参中使用const指针 函数如何向外部返回多个值 总 ...

  6. java 传值为不可变_Java函数传参(String的不可变性)

    本篇博客无意讨论Java里面函数传参是否只有值传递还是值传递和引用传递同时存在,仅讨论函数传参的一些原理. 一. 什么是函数传参? 最常见的一个swap函数:下面这个swap函数并不能实现我们想要的交 ...

  7. C语言与java中函数传参比较

    C语言与java中函数传参比较 首先先说结论:C语言中参数传递有值传递,地址传递,引用传递.但java中的参数传递只有值传递 1.C语言中的参数传递 1>值传递 值传递非常好理解,其实就是对函数 ...

  8. 指针进阶(指针与数组传参、数组指针与指针数组、函数指针数组、回调函数的辨析)

    指针 指针作为C语言中极具代表性的特征之一,也是C语言学习中的一大难点. 简单来说,指针我们需了解的最基础的即: 指针是一个用来存放地址的变量,地址唯一标识一块内存空间. 指针的大小是固定的4/8个字 ...

  9. 数组传参中形参的秘密,以及数组名当作函数实际参数的特点,以及二维数组,以及外部变量和全局变量

    1.数组传参中形参的秘密 第三行:形参中不存在数组的概念,即便是中括号约定了数组的大小,也无效. 第二十行:传递的是一个地址,是数组的首地址. 数组名代表了整个数组的首地址. 第二十一行:第一个元素的 ...

最新文章

  1. eclipsevue代码怎么运行_[Java教程]使用eclipse初步学习vue.js操作
  2. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY16-强化学习
  3. 设置activity图标
  4. OVH数据中心失火事件关于运维管理的思考
  5. Ubuntu录制GIF动画
  6. pandas常见错误类型TypeError: bad operand type for unary ~: 'float'
  7. java的设计模式用的什么软件_《图解Java多线程设计模式》UML用什么软件画?
  8. exe打包工具哪个最好_一键分发工具哪个最好用?30万人选择这款
  9. Codeforces 437D 贪心+并查集
  10. idea+maven打包Java项目
  11. mysql所选路径已经存在_【mysql第二次安装不了】mysql安装失败怎么清理干净?
  12. 【BZOJ】2194: 快速傅立叶之二
  13. Linux学习之安装配置VM虚拟机
  14. 你必须知道的指针基础-6.内存的初始化及结构体的使用
  15. Kotlin | 关于 Lazy ,你应该了解的这些事
  16. oracle中笛卡尔积怎么用,Oracle的表连接方法(四)笛卡尔积
  17. Sublime Text 3默认临时/缓存文件保存位置
  18. 盘点人气云计算大数据开源技术变迁
  19. ansible填坑记一,UNREACHABLE
  20. 破解 Kotlin 协程(6) - 协程挂起篇

热门文章

  1. 零元学Expression Blend 4 - Chapter 1 缘起
  2. linux下socket编程-TCP
  3. Nginx源码分析(3)
  4. 丁钧:移动,未来的王
  5. 使用Deinstall专用工具删除Oracle Database
  6. CCNA课堂练习三:标准访问控制列表和扩展访问控制列表的区别
  7. web developer tips (70):使用命令脚本安装IIS7
  8. 室内使用酒精消毒的时候一定要注意开窗!!!
  9. new uk psw policy
  10. 从人生(论文)的数量追求人生的质量