IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C语言】利用指针变量作函数形参,交换两数(3.0版本 ×××)(稍微深入理解指针) -> 正文阅读

[C++知识库]【C语言】利用指针变量作函数形参,交换两数(3.0版本 ×××)(稍微深入理解指针)

代码如下

本次3.0版本中测试部分较多,还请多一点耐心呀!

在此之前,先来回看一下之前交换两数的1.0版本:【C语言】利用指针变量作函数参数,交换两数

这是2.0版本:【C语言】利用指针变量作函数形参,交换两数(2.0版本 √)

其实两个版本的区别之处,很小,只是在Swap()函数中做了些许处理。

第三个版本亦是如此,但是该版本无法实现交换两数的功能,这里单独列出,是为了加深对指针的理解。代码如下:

//交换两数  3.0版本。可以吗?  不可以的!× 
#include <stdio.h>
void Swap(int *x,int *y);
int main(){
	int a,b;
	printf("Please enter a,b: ");
	scanf("%d,%d",&a,&b);
	printf("\n"); 
	
	printf("Before Swap: a=%d,b=%d\n",a,b);
	printf("\n");
	
	Swap(&a,&b);//注意这里填的。 
	printf("After Swap: a=%d,b=%d\n",a,b);
	return 0;
}
void Swap(int *x,int *y){
	int *t;  
	t=x;  // 这里相比之前2.0版本,又做出了改变,下面亦如此。 
	x=y;
	y=t;
}

测试输出

这一版本,做出的区别还是挺大的。虽然还是在函数体内,int *t 还是没有变化。可是交换的语句却发生了变化,最后却不能实现交换两数的功能,这是为何?

在这里插入图片描述

简析

我们对程序做出一些改变,增加一些打印输出语句,看看程序到底做了什么,Swap()函数内部到底干了啥嘞?

//交换两数  3.0版本。可以吗?  不可以的!× 
#include <stdio.h>
void Swap(int *x,int *y);
int main(){
	int a,b;
	//printf("111");
	printf("Please enter a,b: ");
	scanf("%d,%d",&a,&b);
	printf("\n"); 
	
	printf("Before Swap: a=%d,b=%d\n",a,b);
	printf("\n");
	
	Swap(&a,&b);//注意这里填的。 
	printf("After Swap: a=%d,b=%d\n",a,b);
	
	//printf("666\n");
	return 0;
}
void Swap(int *x,int *y){
	printf("测试输出_01:&x is %p\n",x);  //这三行测试输出 
	printf("测试输出_02: &y is %p\n",y); 
	printf("\n");
	
	int *t;  
	t=x;  // 这里相比之前2.0版本,又做出了改变,下面亦如此。 
	x=y;
	y=t;
	
	printf("测试输出_03:&x is %p\n",x);  //这三行也是测试输出 
	printf("测试输出_04: &y is %p\n",y); 
	printf("\n");
}

上面的程序测试如下:

注意看绿色框框里的,可以看到的确是实现了“交换”,因为地址都交换了!但那是交换的什么地址呢?在我看来,应当是所谓形参的,可以看到主要的交换语句是 t=x; x=y; y=t; 我们知道,x和y是分别指向两个整型数据的指针变量。不是很好理解的话,接下来再对程序做一点改变,继续输出内容。

在这里插入图片描述
改变如下:

更改的(新增)测试输出语句依然在Swap()函数中,为了程序完整所以也把main()函数带上了。

//交换两数  3.0版本。可以吗?  不可以的!× 
#include <stdio.h>
void Swap(int *x,int *y);
int main(){
	int a,b;
	//printf("111");
	printf("Please enter a,b: ");
	scanf("%d,%d",&a,&b);
	printf("\n"); 
	
	printf("Before Swap: a=%d,b=%d\n",a,b);
	printf("\n");
	
	Swap(&a,&b);//注意这里填的。 
	printf("After Swap: a=%d,b=%d\n",a,b);
	
	//printf("666\n");
	return 0;
}
void Swap(int *x,int *y){
	printf("初始:\n");
	printf("测试输出_01:&x is %p , , , x is %d\n",x,*x);  //这三行测试输出 ,逗号后为新增 
	printf("测试输出_02: &y is %p , , , y is %d\n",y,*y); 
	printf("\n");
	
	int *t;  
	t=x;  // 这里相比之前2.0版本,又做出了改变,下面亦如此。 
	x=y;
	y=t;
	
	printf("而后:\n");
	printf("测试输出_03:&x is %p , , , x is %d\n",x,*x);  //这三行也是测试输出,逗号后亦为新增 
	printf("测试输出_04: &y is %p , , , y is %d\n",y,*y); 
	printf("\n");
}

输出如下:

所以说,“交换”确实是“实现”(×××)了,但仅仅是在Swap()函数内部,当执行完Swap()函数之后,变量将会“销毁”,并不会传回去,我认为 这就和1.0版本最初的那个引例道理一样,那么我们再来回看一下引例。
在这里插入图片描述
引例的程序:(直接加一些测试 输出语句看看)请略过注释部分,直接看下面的正式程序:

/* 
#include <stdio.h>
void Swap(int x,int y);
int main(){
	int a,b;
	printf("Please enter a,b: ");
	scanf("%d,%d",&a,&b);
	printf("Before Swap:a=%d,b=%d\n",a,b);
	Swap(a,b);
	printf("After Swap:a=%d,b=%d\n",a,b);
	return 0;
}
void Swap(int x,int y){
	int t;
	printf("first:x=%d, y=%d\n",x,y);
	t=x;
	x=y;
	y=t;
	printf("--------------------\n");
	printf("second: x=%d, y=%d\n",x,y);
}
*/


/*
//利用指针变量作函数参数,执行:交换两数 
#include <stdio.h>
void Swap(int *x,int *y);
int main(){
	int a,b;
	printf("Please enter a,b: ");
	scanf("%d,%d",&a,&b);
	printf("\n"); 
	
	printf("Before Swap: a=%d,b=%d\n",a,b);
	printf("\n");
	
	Swap(&a,&b);//注意这里填的。 
	printf("After Swap: a=%d,b=%d\n",a,b);
	return 0;
}
void Swap(int *x,int *y){
	int t;
	t=*x;  //注意这里。 
	*x=*y;
	*y=t;
}
*/

//测试  理解
#include <stdio.h>
void Swap(int x,int y);
int main(){
	int a,b;
	printf("Please enter a,b: ");
	scanf("%d,%d",&a,&b);
	printf("\n");
	printf("Before Swap:a=%d,b=%d\n",a,b); printf("\n");
	Swap(a,b);
	printf("After Swap:a=%d,b=%d\n",a,b);
	return 0;
}
void Swap(int x,int y){
	printf("初始:-------------\n");
	printf("x=%d, y=%d\n",x,y); 
	printf("\n");
	
	int t;
	t=x;
	x=y;
	y=t;
	
	printf("而后:----------------\n");
	printf("x=%d, y=%d\n",x,y); 
	printf("\n");
}

输出为:

所以说,最简单的这个例子,应该可以对上面为何不能实现交换两数,有所理解吧!

有任何说的不准确或者不完美的地方,欢迎各位道友不吝指正呀!!!

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 21:52:22  更:2022-03-17 21:53:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:31:46-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码