交换两个整形变量的数值

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
请按任意键继续. . .

总结:

当需要调用函数对变量进行比较时,需要利用指针通过地址间接访问变量,再对变量进行比较。

以上是关于交换两个整形变量的数值的主要内容,如果未能解决你的问题,请参考以下文章

交换两个整形变量的数值

交换两个整形变量的数值

第二次作业——交换两个整形变量的数值

交换两个整形变量

不借助任何中间变量将两个整形变量的值交换

c#写一个方法交换两个整数变量的值