代码分析

下面先举两个常见的错误例子

例一

#include <stdio.h>void change(int a, int b);int main()
{int a = 1;int b = 2;printf("交换前: %d %d\n", a, b);//1 2change(a, b);printf("交换后: %d %d\n", a, b);//1 2
}void change(int a, int b)
{int temp = 0;temp = a;a = b;b = temp;
}

这段代码是无法达成交换main函数中a和b的值的目的的,下面我们来分析一下原因。

图一:进入change函数前a和b各自的地址和值

图二:在执行完change函数后a和b各自的地址和值(仍在change函数中)

由图可知,在main函数和change函数中,a和b的地址是不同的,也就是说在执行语句change(a, b)时,我们是在change函数中创造了新的变量a和b,并将main函数中a和b的值赋给change中的a和b,所以,无论change函数中的a和b如何操作,对main函数中的a和b都没有任何的影响。

例二

#include <stdio.h>void change(int* a, int* b);int main()
{int a = 1;int b = 2;printf("交换前: %d %d\n", a, b);change(&a, &b);printf("交换后: %d %d\n", a, b);
}void change(int* a, int* b)
{int* temp = 0;temp = a;a = b;b = temp;
}

相较于例一来说,例二完成了地址的传递,只是在交换时,没有进行解引用,仅仅只在交换地址

图三:执行change语句前a和b各自的地址和值

图四:执行完change函数后a和b各自的地址和值(仍在change函数中)

注意这里和例一不同的是,例一传入change函数的是a和b的值,而例二传入的是a和b的地址。但是我们也仅仅是在change函数中创造了新的指针a和b,用于存放a和b的地址。我们是可以通过地址来改变main函数中a和b的值的,但需要有解引用(*)来操作。在例二中并没有这种操作,只是单纯的对change函数中a和b的值(即main函数中a和b的地址)进行了交换,不会影响到main函数中a和b。


正确写法

#include <stdio.h>void change(int* a, int* b);int main()
{int a = 1;int b = 2;printf("交换前: %d %d\n", a, b);change(&a, &b);printf("交换后: %d %d\n", a, b);
}void change(int* a, int* b)
{int temp = 0;temp = *a;*a = *b;*b = temp;
}

该方法在change函数中创造了新的指针a和b,用于存放a和b的地址。并通过解引用对main函数中的a和b的值进行了交换。

C语言使用函数交换两个数的值相关推荐

  1. C语言写一函数交换两变量的值

    C语言写一函数交换两变量的值 #include <stdio.h> void swap(int *p1, int *p2); // 形参,只声明 int main(){int a=5, b ...

  2. C语言异或交换两个数的原理解析-大厂面试题:不使用第三变量交换两个数的值

    常用操作交换两个数的值 常用的交换两个数值的方法一般是采用第三个变量,这种方法简单易懂,用代码举例 int main() {//交换两个整形变量int a = 3;int b = 5;int c = ...

  3. 【java】java 如何不使用第三个变量来交换两个数的值

    文章目录 1.概述 2.方案 2.1 算术运算 2.2 位运算 1.概述 今天是一个悲伤的一天,我的悲伤逆流成河.非常非常的悲伤.主要是有这个一个面试题.如何不使用第三个变量来交换两个数的值. 考官说 ...

  4. 不用中间变量交换两个数的值

    交换两个数的值是一件非常简单的任务,如果交换a与b,我们一般这样做: tmp = a; a = b; b = tmp; 如果不用中间变量tmp,有以下两种方法: 方法1: a=a+b; b=a-b; ...

  5. C语言交换两个数的值与形参与实参理解

    C Simple Swap Program – Assignments 通过赋值来实现交换变量 vi swap_simple0.c #include <stdio.h>int main() ...

  6. java 交换两个数的值(临时变量,加减,异或)

    临时变量 开发中一般使用此方式 加减 第二种写法: //3.使用加减d1=d1+d2;d2=d1-d2;d1=d1-d2;System.out.println("d1="+d1+& ...

  7. C语言通过指针交换两个数

    #include<stdio.h> void swap1(int *p1,int *p2){//p1,p2分别对应a,b的地址,*p1和*p2分别对应a和b的值 int p;//p是一个变 ...

  8. java swap函数_Java 利用swap函数交换两个整型数据值

    提到交换两个数a, b的值,一定可以想起很多方法,a = a+b;b = a - b; a = a - b;借助temp的方法等等,但是如果食用swap方法的话,这个问题可是很有研究的了,要求使用sw ...

  9. JAVA用一个函数交换两个数字

    JAVA用一个函数交换两个数字 1.方法 直接交换和用包装了交换都不能交换两个数的值!!! 而采用数组交换和成员变量交换是可以做到的 package com.wq.swap; public class ...

最新文章

  1. the resource is not on the build path of a java project错误
  2. python小知识点
  3. JVM:类加载机制之类加载过程
  4. mysql锁相关讲解及其应用——《深究mysql锁》
  5. /dev/null 2>1 详解
  6. kafka消息消费有延迟_消息中间件选型分析---从Kafka与RabbitMQ的对比来看全局
  7. Design Compiler指南——预综合过程
  8. Java中多线程的性能比较
  9. 【软件开发底层知识修炼】二 深入浅出处理器之二 中断的概念与意义
  10. ActiveMQ 权限
  11. php导入scv文件
  12. 聊聊量子计算机那些事
  13. 分析法 :3W1H --- 5W1H 的解释
  14. Php区分自然量跟aso量,ASO优化师该如何判断做优化时下载量与评论的比例关系
  15. oracle 00314,【案例】Oracle报错ORA-00314 数据库异常关机导致redo SCN不一致无法启动...
  16. Telegram、Telethon
  17. 博客赚钱也疯狂--个人博客如何赚钱
  18. 6.2已知5个学生信息,要求输出成绩最高的学生的信息
  19. 2019---高考加油!!!
  20. matlab合成和弦,基于Matlab实现音乐识别与自动配置和声的功能.pdf

热门文章

  1. chatgpt3.5生成的关于电磁阀的论文
  2. 华为openEuler知识点总结——第一弹
  3. 简单的抽卡模拟器1.0
  4. 新鲜出炉的软件测试面试题
  5. [DS_PRATICE]列出连通集(c语言)
  6. 微波射频网在世界电信日 成功召开4G手机射频技术研讨会
  7. Django学习 模型
  8. Python黑马头条推荐系统第三天 实时计算和召回业务、推荐业务流实现与ABTest
  9. 小全读论文《Learning without Forgetting》TPAMI 2017
  10. 互联网公司员工职级、研发效能度量、OKR与绩效考核