将三个数按照从小到大输出 (Swap函数与指针)

笔记 专栏收录该内容
42 篇文章 0 订阅

将三个数按照从小到大输出

最最最简单且麻烦的 第1种

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a = 0; int b = 0; int c = 0; int temp = 0;
	scanf("%d%d%d", &a,&b,&c);
	printf("初始顺序为\n%d %d %d\n",a,b,c);
	if (a>b)
	{
		temp = a;
		a = b;
		b = temp;
	}
	if (a>c)
	{
		temp = a;
		a= c;
		c = temp;
	}
	if (b>c)
	{
		temp =b ;
		b= c;
		c = temp;
	}
	printf("从小到大排序为\n%d %d %d\n",a,b,c);
	system("pause");
	return 0}

在这里插入图片描述
这里面还有一个坑就是c语言规定对变量的定义必须放在当前代码块的最前面 当前代码块的最前面不一定是main 函数的最前面。也可以是比如一个for循环里面要用到一个自定义变量,那就放在for所在的代码块的最前面就行

虽然我用的vs 2013对这个没有强制要求,但换一个编译器谁知道呢。因此严谨一点总归不会错。

反反复复敲了三遍If 要是有个函数就棒呆了

调用swap函数 第2种

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void Swap(int*px, int*py)
{
	int tmp = *px;
	* px =*py;
	* py = tmp;
}

int main()
{
	int a = 0; int b = 0; int c = 0; int temp = 0;
	scanf("%d%d%d", &a,&b,&c);
	printf("初始顺序为\n%d %d %d\n",a,b,c);
	if (a>b)
		Swap(&a, &b);
	if (a>c)
		Swap(&a, &c);
	if (b>c)
		Swap(&b, &c);
	printf("从小到大排序为\n%d %d %d\n",a,b,c);
	system("pause");
	return 0;
}

在这里插入图片描述

调试
fn+f10 逐语句调试
fn+f11 逐过程调试
调试的时候发现确实出现了问题
实参传给形参的时候,形参是实参的一份临时拷贝(对形参的修改不会改变实参)
实参有开辟了一份空间形参也开辟了空间 ,这两块空间是相互独立的。
解决办法 让实参与形参的修改建立联系

指针闪亮登场
传输地址两者建立联系 通过地址可以找到它且改变它。
把a的地址交给px px就有能力改变改变a.

错误的代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
void swap(int x, int y)
{
	int temp = 0;
	temp = x;
	x = y;
	y = temp;
}

int main()
{
	int a = 0; int b = 0; int c = 0; int temp = 0;
	scanf("%d%d%d", &a,&b,&c);
	printf("初始顺序为\n%d %d %d\n",a,b,c);
	if (a>b)
		swap(a, b);
	if (a>c)
		swap(a, c);
	if (b>c)
		swap(b, c);
	printf("从小到大排序为\n%d %d %d\n",a,b,c);
	system("pause");
	return 0;
}

最后
写完这篇我终于搞懂了一点点。当时书上学c的时候一直不知道到底是怎么搞的,有的函数传地址,有的就不传地址,当函数内部想改变外部的值传递地址就完事。果然实践出真知。调试的时候看看监视器真的一下就明白问题出在哪里了。

  • 4
    点赞
  • 0
    评论
  • 12
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页

打赏作者

应钟二十六

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值