交换两个整形变量的数值
Posted 做题日常
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交换两个整形变量的数值相关的知识,希望对你有一定的参考价值。
1、构建swap函数,实现两个整型变量数值的交换,且使用指针类型的数据作为swap函数的参数。
#include<stdio.h> void swap(int *p,int *q)//定义swap函数,定义两个指针参数 { int m;// 定义一个整形m来做数据交换的中介 m=*p; *p=*q; *q=m;//3步交换 } main() { int a,b;//定义两个整形变量a,b printf("输入a,b的值:") ; scanf("%d %d",&a,&b); printf("swap函数调用前:%d %d\\n",a,b); swap(&a,&b);//调用swap函数,将啊a,b的地址传给swap函数 printf("swap函数调用后:%d %d\\n",a,b); }
输入a,b的值:1 2
swap函数调用前:1 2
swap函数调用后:2 1
--------------------------------
Process exited after 2.178 seconds with return value 0
请按任意键继续. . .
总结:
主函数中的整形参数a,b通过利用取址&a,&b调用swap函数并向函数中的指针p,q传递地址,p,q通过地址访问a,b的值并在swap函数内调换,做到利用函数进行调换的效果
2、void swap(int *p,int *q){int *m;*m=*p;*p=*q;*q=*m;}为何无法实现交换?
#include<stdio.h> void swap(int *p,int *q)//定义swap函数,定义两个指针参数 { int *m;// 此处将源代码中的整形m换成一个指针m用来交换 *m=*p; *p=*q; *q=*m; } main() { int a,b;//定义两个整形变量a,b printf("输入a,b的值:") ; scanf("%d %d",&a,&b); printf("swap函数调用前:%d %d\\n",a,b); swap(&a,&b);//调用swap函数 printf("swap函数调用后:%d %d\\n",a,b); }
蹦出错误提示 进行程序调试
void swap(int *p,int *q) { int *m;// 此处将源代码中的整形m换成一个指针m用来交换 *m=*p;//在调用swap函数时该步出错
*p=*q;
*q=*m;
}
出错原因很简单,因为指针是一个值为内存地址的变量,一个有效的指针必然是以下三种状态之一:1.保存一个特定对象的地址;2.指向某个对象后面的另一对象;3.是0值。若指针保存0值,表明它不指向任何对象。未初始化的指针是无效的,直到给该指针赋值后,才可以使用它。我们定义的一个指针int *m,m可以储存一个指向int型数据的内存单元的地址,然后用简介运算符*去访问m指向的地址的内存单元所储存的值,但在刚定义完指针m时,它不储存任何内存单元的地址,只是存放一个随机的不确定的值,这时候我们利用*m=*p等于在调用m储存的这个不确定值作为的地址中存储的数据。这是错误且非法的,因此在调用未初始化的指针时,编译器往往会给出崩溃的提示,我们可以试着为指针m指向一个开辟出来的内存空间来验证
#include<stdio.h>
#include<stdlib.h>
void swap(int *p,int *q)//定义swap函数,定义两个指针参数 { int *m;// 将源代码中的整形m换成一个指针m用来交换 m=(int *)malloc(100);//开辟一个大小为100字节的空间并让指针m指向这个储存空间的地址 *m=*p; *p=*q; *q=*m; }
main() { int a,b;//定义两个整形变量a,b printf("输入a,b的值:") ; scanf("%d %d",&a,&b); printf("swap函数调用前:%d %d\\n",a,b); swap(&a,&b);//调用swap函数 printf("swap函数调用后:%d %d\\n",a,b); }
输入a,b的值:1 2
swap函数调用前:1 2
swap函数调用后:2 1
--------------------------------
Process exited after 2.177 seconds with return value 0
请按任意键继续. . .
程序运行成功
总结:
要切记指针是一个值为内存地址的变量,在定义完一个指针后,若它不指向一个内存单元的地址,则它本身是无法储存其他数据的。
3、void swap(int *p,int *q){int *m;m=p;p=q;q=m;}为何无法实现交换?
#include<stdio.h>
void swap(int *p,int *q)//定义swap函数,定义两个指针参数 { int *m;// 将源代码中的整形m换成一个指针m用来交换m=p;//让指针m获得指针p储存的地址 p=q;//让指针p获得指针q储存的地址 q=m;//让指针q获得指针m储存的地址 }
main() { int a,b;//定义两个整形变量a,b printf("输入a,b的值:") ; scanf("%d %d",&a,&b); printf("swap函数调用前:%d %d\\n",a,b); swap(&a,&b);//调用swap函数 printf("swap函数调用后:%d %d\\n",a,b); }
输入a,b的值:1 2
swap函数调用前:1 2
swap函数调用后:1 2
--------------------------------
Process exited after 1.353 seconds with return value 0
请按任意键继续. . .
这道题的问题在于swap函数并未能成功调换a,b的值,输入的是a=1,b=2调用函数前和调用函数后a,b的值都不变,问题出在虽然调用swap时程序将a,b的地址传递给了swap函数中定义的指针p,q但是在swap函数内,只交换了指针p,q的地址,并非对地址中所储存的值进行调换,所以a的地址和值不变,b的地址和值也不变,输出时a,b自然也不会变,可以通过输出指针p,q在转换前后的值进行验证
#include<stdio.h>
void swap(int *p,int *q)//定义swap函数,定义两个指针参数 { int *m;// 将源代码中的整形m换成一个指针m用来交换 printf("交换前指针p,q所指向地址的值:%d %d\\n",*p,*q); m=p; p=q; q=m; printf("交换后指针p,q所指向地址的值:%d %d\\n",*p,*q); }
main() { int a,b;//定义两个整形变量a,b printf("输入a,b的值:") ; scanf("%d %d",&a,&b); printf("swap函数调用前:%d %d\\n",a,b); swap(&a,&b);//调用swap函数 printf("swap函数调用后:%d %d\\n",a,b); }
输入a,b的值:1 2
swap函数调用前:1 2
交换前指针p,q所指向地址的值:1 2
交换后指针p,q所指向地址的值:2 1
swap函数调用后:1 2
--------------------------------
Process exited after 2.074 seconds with return value 0
请按任意键继续. . .
总结:
当需要调用函数对变量进行修改时,需要利用指针通过地址间接访问变量,再对变量进行修改。
4、构建comp函数,实现两个整数比较,比较大的值通过返回值返回给main。要求comp的参数和返回值都是指针类型数据。
#include<stdio.h> int comp(int *p,int*q)//定义comp函数,定义两个指针参数 { if(*p>*q)return *p;//如果指针p指向的值大于指针q指向的值,返回*p else return *q;//反之如果指针q指向的值大于指针p指向的值,返回*q } main() { int a,b;//定义两个整形变量a,b printf("输入a,b的值:") ; scanf("%d %d",&a,&b); printf("comp函数调用前:%d %d\\n",a,b); printf("comp函数调用后输出较大的值:%d\\n",comp(&a,&b));//输出调用comp函数后得到的a,b间的较大值 }
输入a,b的值:1 2
comp函数调用前:1 2
comp函数调用后输出较大的值:2
--------------------------------
Process exited after 2.001 seconds with return value 0
请按任意键继续. . .
总结:
当需要调用函数对变量进行比较时,需要利用指针通过地址间接访问变量,再对变量进行比较。
以上是关于交换两个整形变量的数值的主要内容,如果未能解决你的问题,请参考以下文章