关于swap的c语言中swap问题

8061人阅读
C/C++(4)
最近在学习数据结构和算法,发现使用到swap()函数,于是重新看了一下swap函数的各种实现,发现我对函数实参和形参理解不够透彻,现在分享我对swap的一些见解。
我们通常使用以下一段代码来实现整型变量的交换:
void swap(int *a,int *b)
}而以下两种是不能实现交换的:
void swap1(int a,int b)
void swap2(int *a,int *b)
}对于swap1,不能实现交换的理由是,C语言中函数的传的是形参,也就是一个副本,虽然在函数内体内交换了,但对真实的数据没影响。就如以下代码:
int a=1,b=2;
int ta=a,tb=b;
}a和b并没有因此交换。
而对于swap2,执行过程如下代码:
int a=1,b=2;
int *ta=&a,*tb=&b;
printf("a=%d,b=%d",a,b);由于这种方式改变不了由编译器所分配的内存地址,所以a,b的值还是不能改变,仅仅交换了副本的地址,pirintf("a'=%d,b'=%d\n",*ta,*tb);可以看到交换了有副本指向的内容,但a,b内容不会变!
void swap1(char **a,char**b)
//使用char *pa=&a,*pb=&b;
//swap1(&pa,&pb);这样的形式调用调用前和调用后分别打印printf("a=%d,b=%d,a'=%x,b'=%x\n",a,b,&a,&b);可以看到:并没有交换a和b由编译器分配的地址,交换的是指针pa和pb的值。所以a和b的值还是没变。
最后关于C语言的泛型编程,上面的swap()只能处理整型变量,但我们需要同时可以处理char、double、long型的变量,我们可以使用void*和size_t这些类型来达到。如下
void swap(void *a,void *b,size_t size)
char *p1=(char *)a;
char *p2=(char *)b;
while(size--)
使用这样的形式调用:int c=1000,d=-18;
swap(&c,&d,sizeof(int));但要注意的是彼此之间应该是同种类型,否则会出现错误的结果。对于C语言中的swap函数,是交换变量a,b,到底交换的是什么?
看参数的类型,如果参数是值传递,只交换形参,如果是引用参数,则交换所传递的值
f(x)=loga(x+根号下x?+2a)是奇函数f(x)+f(-x)=loga(x+根号下x?+2a)+loga(-x+根号下x?+2a)=loga(x^2+2a-x^2) 这里用到平方差=loga(2a)=0所以2a=1a=1/2
15-15*(24/25)=15(1-24/25)=15*1/25=3/5
x^4-7x^2+1=x^4+2x^2+1-9x^2=(x^2+1)^2-(3x)^2=(x^2-3x+1)(x^2+3x+1).
1.2x?=5-3x 2x?+3x-5=0(2x+5)(x-1)=0x1=-5/2,x2=12.3x?+4=4√3x 3x?-4√3x+4=0(√3x-2)?=0x1=x2=2/√33.4x?-3x=0x(4x-3)=0x1=0,x2=3/4
其他相关问题形式参数(formal argument)和实际参数(actual argument)是什么?
void function(int n); //n为形式参数
  int times=5;
  function(times); //times为实际参数
void function(int n)
  for(int i=0;i&n;i++)
  printf("hello\n");
 在声明一个参数时就创建了一个叫形式参数的变量,在上面的例子中形式参数是叫做n的变量。
 函数调用function(times)把times的值5赋给了n,times被称为实际参数,也就是说main()中的变量times的值被复制给了function()中的新变量n。
 在形参与实参传递的概念中有个很经典的例子,就是用一个函数交互两个变量的值
#include &stdio.h&
void swap(int a1, int b1);
int main()
int a=0,b=1;
swap(a,b);
printf("a=%d , b= %d",a,b);
void swap(int a1, int b1)    //无效的交互函数
int temp=a1;
  &初学的时候很容易写出上面的代码,但是没有达到交换的目的,原因是这里交换的只是函数中形式参数的值,实参只是把它的值复制给了形式参数,当函数作用完成后,函数中的参数也随之销毁了,如例子中想交换main中a,b的值,把它们的值分别复制给了swap函数中的a1,b1,然后在函数中a1和b1的值确实是交换了,但是随之它们就销毁了,main中的a,b的值还是原来的值。
  想要交换a,b的值,其实就是相当于要在函数中改变变量的值,要做到这一点,就需要向形式参数传递实际参数的地址了,因为这样把变量的地址复制到函数中的变量里,它们指向的是内存中的同一个地方,在函数中改变这个地方的值,那么外部的变量的值也就改变了。
  下面的代码可以到达交换目的
#include &stdio.h&
void swap(int * a1, int * b1);
int main()
int a=0,b=1;
swap(&a , &b);
//传递的是实参的地址
printf("a=%d , b= %d\n",a,b);
void swap(int * a1, int * b1)
int temp = *a1;
*a1 = *b1;
阅读(...) 评论()c语言2个整数交换问题_百度知道
c语言2个整数交换问题
并没有实现交换目的,b); printf(&%d;,a,b),5,%d\n& t=x; x=y; swap(a;}高手帮忙分析下,为什么最后输出还是3; y=t;}void main(){ int a=3,b=5; printf(&%d#include&stdio.h&gt,int y){void swap(,a,b),%d\n&quot
我有更好的答案
printf(& printf(&quot,int *y){ t=*x; *x=*y;n&; *y=t,b); swap(&a,a,a,&b);}void main(){ int a=3,b=5.h&void swap(int *x;n&;%d,%d&#92这个是指针问题你交换只是在 swap这个函数里进行交换但是没有对 main函数里本来的数值进行交换#include&%d,%d&#92
采纳率:65%
你这个采用的是值交换,在调用的函数里换完后,函数生命期结束死掉,而main函数里的值还是没有变化。你应该采用地址交换(实现地址交换)或引用交换如://地址交换/*void swap(int*x, int*y){ int Temp = 0; Temp = *x; *x = *y; *y = T}int main(int argc, char**argv){
int a=3,b=5;
printf(&%d,%d\n&,a,b);
swap(&a,&b);
printf(&%d,%d\n&,a,b);}*///引用交换void swap(int &x, int &y){ int Temp = 0; Temp = x = y = T}int main(int argc, char**argv){
int a=3,b=5;
printf(&%d,%d\n&,a,b);
swap(&a,&b);
printf(&%d,%d\n&,a,b);}我再加一种方法//不引用第三变量交换两个变量void swap(int &x, int &y){ x = x^y; y = y^x; x = x^y;}void main(){ int a=3,b=5; printf(&%d,%d\n&,a,b); swap(&a,&b); printf(&%d,%d\n&,a,b);}
函数的参数就不能是值,而应该是地址,而是把这两个参数copy一份,用copy的值进行运算,你可以认为函数在内部又定义了两个变量 int x=a:void swap(int *x, int *y){temp = *x;*x=*y;*y=}使用的时候应该这样用:swap(&a , &b);这样给函数传的参数是变量a和b的地址这个涉及到函数的形参与实参问题函数体内部的运算只能改变形参而不能改变实参用简单地话来说,就是你给了两个参数int a和int b给函数,但是函数并不是直接用这两个参数进行运算的;函数内所有要用到a和b的值的时候,都是用x和y代替的,因此你在函数内对x,y的操作不能影响到外面的a和b如果需要在函数内实现两数交换的目的,int y=b,所以swap函数应该这样写
#include&stdio.h&void swap(int &x,int &y){ t=x; x=y; y=t;}void main(){ int a=3,b=5; printf(&%d,%d\n&,a,b); swap(a,b); printf(&%d,%d\n&,a,b);}还有一种方法就是把参数改为引用类型,这种方法更方便 -----------别人答得太快了
其他1条回答
为您推荐:
其他类似问题
您可能关注的内容
c语言的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。对于C语言中的swap函数,是交换变量a,b,到底交换的是什么?_百度知道
对于C语言中的swap函数,是交换变量a,b,到底交换的是什么?
我有更好的答案
看参数的类型,如果参数是值传递,只交换形参,如果是引用参数,则交换所传递的值
采纳率:45%
为您推荐:
其他类似问题
swap的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 c语言swap是什么意思 的文章

 

随机推荐