C语言使用函数交换两个数的值
代码分析
下面先举两个常见的错误例子
例一
#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语言使用函数交换两个数的值相关推荐
- C语言写一函数交换两变量的值
C语言写一函数交换两变量的值 #include <stdio.h> void swap(int *p1, int *p2); // 形参,只声明 int main(){int a=5, b ...
- C语言异或交换两个数的原理解析-大厂面试题:不使用第三变量交换两个数的值
常用操作交换两个数的值 常用的交换两个数值的方法一般是采用第三个变量,这种方法简单易懂,用代码举例 int main() {//交换两个整形变量int a = 3;int b = 5;int c = ...
- 【java】java 如何不使用第三个变量来交换两个数的值
文章目录 1.概述 2.方案 2.1 算术运算 2.2 位运算 1.概述 今天是一个悲伤的一天,我的悲伤逆流成河.非常非常的悲伤.主要是有这个一个面试题.如何不使用第三个变量来交换两个数的值. 考官说 ...
- 不用中间变量交换两个数的值
交换两个数的值是一件非常简单的任务,如果交换a与b,我们一般这样做: tmp = a; a = b; b = tmp; 如果不用中间变量tmp,有以下两种方法: 方法1: a=a+b; b=a-b; ...
- C语言交换两个数的值与形参与实参理解
C Simple Swap Program – Assignments 通过赋值来实现交换变量 vi swap_simple0.c #include <stdio.h>int main() ...
- java 交换两个数的值(临时变量,加减,异或)
临时变量 开发中一般使用此方式 加减 第二种写法: //3.使用加减d1=d1+d2;d2=d1-d2;d1=d1-d2;System.out.println("d1="+d1+& ...
- C语言通过指针交换两个数
#include<stdio.h> void swap1(int *p1,int *p2){//p1,p2分别对应a,b的地址,*p1和*p2分别对应a和b的值 int p;//p是一个变 ...
- java swap函数_Java 利用swap函数交换两个整型数据值
提到交换两个数a, b的值,一定可以想起很多方法,a = a+b;b = a - b; a = a - b;借助temp的方法等等,但是如果食用swap方法的话,这个问题可是很有研究的了,要求使用sw ...
- JAVA用一个函数交换两个数字
JAVA用一个函数交换两个数字 1.方法 直接交换和用包装了交换都不能交换两个数的值!!! 而采用数组交换和成员变量交换是可以做到的 package com.wq.swap; public class ...
最新文章
- the resource is not on the build path of a java project错误
- python小知识点
- JVM:类加载机制之类加载过程
- mysql锁相关讲解及其应用——《深究mysql锁》
- /dev/null 2>1 详解
- kafka消息消费有延迟_消息中间件选型分析---从Kafka与RabbitMQ的对比来看全局
- Design Compiler指南——预综合过程
- Java中多线程的性能比较
- 【软件开发底层知识修炼】二 深入浅出处理器之二 中断的概念与意义
- ActiveMQ 权限
- php导入scv文件
- 聊聊量子计算机那些事
- 分析法 :3W1H --- 5W1H 的解释
- Php区分自然量跟aso量,ASO优化师该如何判断做优化时下载量与评论的比例关系
- oracle 00314,【案例】Oracle报错ORA-00314 数据库异常关机导致redo SCN不一致无法启动...
- Telegram、Telethon
- 博客赚钱也疯狂--个人博客如何赚钱
- 6.2已知5个学生信息,要求输出成绩最高的学生的信息
- 2019---高考加油!!!
- matlab合成和弦,基于Matlab实现音乐识别与自动配置和声的功能.pdf