《交换变量值两种方式.docx》由会员分享,可在线阅读,更多相关《交换变量值两种方式.docx(9页珍藏版)》请在第壹文秘上搜索。
1、交换变量值两种方式两个整型指针变量,通过指针方式交换两个整型变量的所赋的值,第一种方法通过交换两个整型变量的地址指针实现,而存放这两个整型变量首地址的指针变量随着这两个整型变量地址的交换而存放的两个首地址也会交换。第二种通过用指针变量所指变量值(指针)来互相赋值,直接达到交换两个指针变量所指的变量的值的目的。1.交换两个变量的地址(指针变量),其对应的变量值不会改变。只是变量地址被交换了,读取变量的值会变,交换了变量所指的值。交换地址变量是指针地址,原指向变量值不变,只是指针所指向的内容变了。例:输入a和b两个整数,按先大后小的顺序输出a和b。用指针变量方法来处理这个问题。不交换整型变量的值,
2、而是交换两个指针变量的值(地址值)。编写程序:#includeintmain()int*pl,*p2,*pzazb;/pllp2的类型是int*类型printf(pleaseentertwointegernumbersscanf(,%dz%dz&a,&b);输入两个整数pl=&a;p2=&b;使pl指向变量a使p2指向变量bif(ab)(P=pl;pl=p2;p2=p。如果ab,使PI与p2的值(地址)互换printf(,a=%dzb=%dnzazb);printf(nmax=%d,min=%dz*plp2);return0;输出a,b输出pl和p2所指向的变量的值运行结果:pleaseent
3、ertwointegernunbers:5,9a=5zb=9max=9fmin=5输入a=5,b=9后,由于ab,需将pl和p2交换。并未交换a,b的值,只是交换了plzp2的值(地址值),交换了plzp2所指向的地址,相当交换了azb的地址,不是交换*pl及*p2的值。中间指针变量*P,是指针类型。p=pl;并未交换azb的值,只是交换了pl,p2的值,交换了plzp2所指向的地址,相当交换了azb的地址)pl=p2;P2=P;注意:a和b的值并未交换,它们仍保持原值,但pl和p2的值改变了。pl的值原为&a,后来变成&b,p2原值为&b,后来变成&ao这样在输出*Pl和*p2时,实际上是输
4、出变量b和a的值,所以先输出9,然后输出5o两个变量的值交换要利用第3个变量。实际上,可以改为Pl=&b;p2=&a;直接对pl和p2赋以新值,这样可以不必定义中间变量P,便程序更加简练。如果超过2个,仍用中间变量容易混淆,一般通过建立第三个变量来交换数值;不建立变量,通过运算的方式交换,如果两数值过大,则可能会溢出,养成好习惯。这个问题的算法是不交换整型变量的值,而是交换两个指针变量的值(即a和b的地址)。2指针变量作为函数参数函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。例:对输入的两个整数按大小顺序输出。如果用函数处理,而
5、且用指针类型的数据作函数参数。第一种方式中直接在主函数内交换指针变量的值(地址交换,不改变量值),现在在主函数之外定义一个交换函数SWaP将指向两个整型变量的指针变量(内放两个变量的地址)作为实参传递给swap函数的形参指针变量,在函数中通过指针实现交换两个变量的值。指针和指针变量的区别区别在于:L一个变量的(内存)地址称为该变量的指针,*p是说指针变量为p,通过指针能找到以它为地址的内存单元。而指针变量是用来存放另一个变量的地址的(即指针),存放地址的变量称为指针变量。指针变量是一种特殊的变量,它不同于一般的变量,一般变量存放的是数据本身,而指针变量存放的是数据的地址。2.如果一个指针变量存
6、放的是某个对象的地址,则称这个指针变量指向该对象。系统为每一个内存单元分配一个地址值,把这个地址值称为指针。如有inti=5;,存放变量i的内存单元的编号(地址)&i被称为指针。指针变量则是存放地址值的变量,指针变量是存放变量所占内存空间首地址的变量(因为一个变量通常要占用连续的多个字节空间)。比如在inti=5;后有一句int*p=&i;,就把i的地址&i赋给了int型指针变量p,也就是说p中存入&i。int*p就是说指针变量是存放指针的变量。指针变量,就是一个存放地址的变量,通常定义整形,实型等变量后,系统给变量分配一定的内存单,用来存放数据的,而定义一个指针变量给它分配的空间是用来存放地
7、址的。且只能存放地址编写程序:#includeintmain()voidSWaP(int*plzint*p2);对swap函数的声明int*pointer_1/Poimer_2;仅限定义两个int型的指针变量,定义声明不等于说指向某整形变量,未被赋值,指针变量名赋值取变量地址。printf(pleaseenteraandb);scanf(%d,%da,&b);输入两个整数pointer_1=&a;pointer_2=&b;使PointerjL指向a使PointeJ2指向bif(ab)swap(pointer_1,pointer_2);printf(nmax=%dzmin=%dnzazb);如果
8、ab,调用swap函数输出结果return0;自定义交换函数voidswap(int*plzint*p2)inttemp;temp=*pl;*pl=*p2;*p2=temp;定义swap函数使*Pl和*p2互换运行结果:pleaseenteraandb:5Z9ma=9zmin=5SW叩是用户自定义函数,它的作用是交换两个变量a和b巡值。SW叩函数的两个形参pl和p2是指针变量。有人说交换函数形参是带*pl,*p2,而调用交换函数SWaP(pointer_1,pointer_2);两个类型有不同,带*p仅表示p属于指针变量,运用指针必须在定义后用指针址址变量p,所以两者是一类,都是指针变量。程序
9、运行时,先执行main函数,输入a和b的值(在这里输入5和9)o然后将a和b的地址分别赋给int*变量pointer_1和pointer_2,使pointer_1指向a,pointer_2指向b,接着执行if语句,由于ab,因此执行swap函数。注意带*指针指向对象必须在定义后被赋值初始化后方可被允许使用。另外实参pointer_1和pointer_2是指针变量,在函数调用时,将实参变量的值传送给形参变量,采取的依然是值传递方式。传变量地址就是传变量的值。形参pl的值为&a,p2的值为&b,这时PI和pointer_1都指向变量azp2和pointer_2都指向bo接着执行SW叩函数的函数体,
10、使*pl和*p2的具体指向地址值互换,也就是使a和b的值互换。函数调用结束后,形参pl和p2不复存在(已释放),最后在main函数中输出的a和b的值已是经过交换的值(a=9,b=5)o请注意交换*pl和*p2的值是如何实现的。如果写成以下这样就有问题了:voidswap(int*pl,int*p2)int*temp;* temp=*pl;*pl=*p2;* p2=*temp;此语句有问题* pl就是a,是整型变量。而*temp是指针变量temp所指向的变量。带*指针指向对象必须在定义后被直接赋值初始化后方可被允许使用或运算。但由于未给temp赋值初始化,这样直接有可能破坏系统的正常工作状况,应
11、该将*pl的值赋给与pl相同类型的变量,而用整型变量temp作为临时辅助变量实现*pl和*p2的交换。采取的方法是交换a和b的值,而Pl和p2的指向地址值不变。可以看到,在执行SW叩函数后,变量a和b的值改变了。设置其它自定义函数功能测试实现a和b互换的目的。voidswap(intxzinty)inttemp:temp=x;x=y;y=temp如果在main函数中调用SW叩函数:SW叩(azb);在函数调用时,a的值传送给X,b的值传送给y,执行完SW叩函数后,X和y的值是互换了,但并未影响到a和b的值。在函数结束时,变量X和y释放了,main函数中的a和b并未互换,也就是说,由于单向传送的
12、值传递方式,形参值的改变不能使实参的值随之改变。为了使在函数中改变了的变量值能被主调函数main所用,不能采取上述把要改变值的变量作为参数的办法,而应该用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化;函数调用结束后,这些变量值的变化依然保留下来,这样就实现了通过调用函数使变量的值发生变化,在主调函数(如main函数)中可以使用这些改变了的值的目的。如果想通过函数调用得到n个要改变的值,可以这样做:1在主调函数中设n个变量,用n个指针变量指向它们;2设计一个函数,有n个指针形参。在这个函数中改变这n个形参的值;在主调函数中调用这个函数,在调用时将这n个指针变量作实参,将它们的值,也就是相关变量的地址传给该函数的形参;3在执行该函数的过程中,通过形参指针变量,改变它们所指向的n个变量的值;(第二种方式)4主调函数中就可以使用这些改变了值的变量。注意:不能企图通过改变指金十形参的值而使指针实参的值改变,推荐第二方式。