下面四个函数哪个能够成功作两个数的交换?这里头涉及传值和传址的问题我比较混乱请大家讲讲原理~~~#includeiostreamusingnamespace 下面四个函数哪个能够成功作两个数的交换?这里头涉及
下面四个函数哪个能够成功作两个数的交换?这里头涉及传值和传址的问题我比较混乱请大家讲讲原理~~~#includeiostreamusingnamespace 下面四个函数哪个能够成功作两个数的交换?这里头涉及传值和传址的问题我比较混乱请大家讲讲原理~~~ #includeusingnamespacestd;voidswap1(intp,intq){inttemp;temp=p;p=q;q=temp;}voidswap2(int*p,int*q){int*temp;*temp=*p;*p=*q;*q=*temp;}voidswap3(int*p,int*q){int*temp;temp=p;p=q;q=temp;}voidswap4(int*p,int*q){inttemp;temp=*p;*p=*q;*q=temp;}intmain(){intp=1,q=2;//swap1(p,q);//swap2(//swap3(//swap4(cout<
52 个解决方案
#1
4
#2
讲讲原理我已经上机试了
#3
4
#4
值传递还是地址传递
#5
第1个当然是直了后三个自然是址
#6
voidswap4(int*p,int*q) { inttemp; temp=*p; *p=*q; *q=temp; } 参数p,q是指针 temp=*p是取得p指向内存的变量值 *p=*q是将q指针指向内存的变量值赋值给p变量指向的变量 *q=temp则是将temp中保存的值(过渡用的)赋值给q指向的变量。 temp是基本变量,所以使用时不能加*
#7
我不太理解是swap2为什么也可以成功交换?
#8
2和4
#9
引用6楼wgzymzx的回复: voidswap4(int*p,int*q) { inttemp; temp=*p; *p=*q; *q=temp; } 参数p,q是指针 temp=*p是取得p指向内存的变量值 *p=*q是将q指针指向内存的变量值赋值给p变量指向的变量 *q=temp则是将temp中保存的值(过渡用的)赋值给q指向的变量。 temp是基本变量,所以使用时不能加* 6楼你好swap2函数是可以通过编译的不信你把temp加*试试?
#10
引用7楼jinder22的回复: 我不太理解是swap2为什么也可以成功交换? *temp=*p; 编译器会给temp分配一个临时空间
#11
1,2,3全错,最后一个是对的。
#12
引用7楼jinder22的回复: 我不太理解是swap2为什么也可以成功交换? voidswap2(int*p,int*q)//操作的是p,q指向的内容 { int*temp; *temp=*p;//temp=p则*temp=*p就是p指向的内容 *p=*q; *q=*temp; }
#13
值传递是传递的副本,指针传递地址,引用则是本身
#14
引用7楼jinder22的回复: 我不太理解是swap2为什么也可以成功交换? int*temp;这是个野指针 *temp=*p是啥意思呢? 你可以这样 *q=*p; *q=(int)temp;
#15
To14楼 swap2确实可以上机编译通过并且还实现了两个数的交换 *temp=*p是啥意思我的确不知道所以才想问问~~
#16
更正一下: 引用14楼sss_free的回复: 引用7楼jinder22的回复: 我不太理解是swap2为什么也可以成功交换? int*temp;这是个野指针 *temp=*p是啥意思呢? 你可以这样 temp=(int*)*p; *q=*p; *q=(int)temp;
#17
temp是个指针,没有分配内存,他没有指向任何一个整数实例, 你来一个 *temp=*p,往哪里拷贝呢?,如果temp的值是个随机数,指向一个不允许写的地方,那肯定被系统终止了。 不要写这样的代码
#18
1是传值调用,在1内部p,q的值确实交换了,但是它们是局部变量,不会影响到主函数中的p和q; 3是和1类似的,原理相同。只是试图交换的对象换成了指针。 2本身是错误的,指针没有分配空间,不能直接赋值。若将int*temp;改为int*temp=newint;也是可以的 4是引用调用。
#19
野指针会报错,LZ是怎么通过编译的
#20
编译过只是说明符合语法。 如果你写 externvoidimportfun(void); typedefvoid(*Ptfunc_T)(void); Ptfunc_Ttemp; temp=importfun; 也可以通过编译,绝对过不了链接,除非你指明的一个库里面有一个importfun的函数,明白了吧。
#21
TO14楼他怎么是野指针呢?它不是都指向了个地方了不野了阿
#22
引用21楼jinder22的回复: TO14楼他怎么是野指针呢?它不是都指向了个地方了不野了阿 voidswap2(int*p,int*q) { int*temp; *temp=*p;<----------------- *p=*q; *q=*temp; } 这还不野啊! 这叫指向了么,那是拷贝啊, temp=p才叫指向,执行后表示temp和p引用了同一个整型实例
#23
voidswap2(int*p,int*q){int*temp=newint;//最好这样写*temp=*p;*p=*q;*q=*temp;}
#24
打个比方,你说让我按你字条上写的地址贴广告,我打开字条上面什么都没写,或者写个中南海,我能去么?
#25
To塔希伦后裔 那就如果这样写是不是就不野了? voidswap2(int*p,int*q){int*temp=p;//*temp=*p;*p=*q;*q=*temp;}
#26
To塔希伦后裔*temp=*p如果是拷贝的话请问他考哪去了?是不是随便考了个地方? 那这么说int*temp; 编译器是给分配内存了?
#27
对,但是那样写是什么意思呢? 1)int*temp=p,表示temp指向和p同样的整形实例。交换是暂时记住*p的 2)如果p的实参也是野的那还是野的
#28
第2个也可以是因为也属于传值啊 只是临时变量是个指针而已
#29
笔误...传地址呵呵
#30
那么 voidswap2(int*p,int*q) { int*temp; *temp=*p; *p=*q; *q=*temp; } 中的int*temp;有没有分配一段内存?还是就单单是个野指针?
#31
up,应该是4
#32
引用30楼jinder22的回复: 那么 voidswap2(int*p,int*q) { int*temp; *temp=*p; *p=*q; *q=*temp; } 中的int*temp;有没有分配一段内存?还是就单单是个野指针? 没分配内存
#33
To塔希伦后裔既然不分配内存*temp=*p;拷贝到哪去了?没有内存拿什么东西来装值啊
#34
引用33楼jinder22的回复: To塔希伦后裔既然不分配内存*temp=*p;拷贝到哪去了?没有内存拿什么东西来装值啊 恭喜楼主你终于明白了,你跟踪一下,看看temp的值,就一个随机地址,你改成00000001试试,应该会抱错的。
#35
谢谢~塔希伦后裔和其他牛人等一下揭帖给分!!!!!!!
#36
voidswap1(intp,intq)//不能。参数是两个新的变量,结果只交换了p,q的值 { inttemp; temp=p; p=q; q=temp; } voidswap2(int*p,int*q)可以。为局部变量*p,*q分配空间,并让他们等于实参p,q的地址 { int*temp; *temp=*p; *p=*q;p(形参)= } voidswap3(int*p,int*q)不能。为局部变量*p,*q分配空间,并让他们等于实参p,q的地址 { int*temp; temp=p;temp=p都等于实参p=q=实参q=temp= temp=*p; *p=*q; *q=temp; }
#37
int*temp; 定义了一个指针而没有赋值,很明显的野指针; 这样的程序太危险,搞不好就会内存报错;程序成功执行只能算是幸运。
#38
不可能会编译通过的啊.楼主兄vs08+vista32你的平台?
#39
s2的语法没问题.
#40
引用36楼operatingtuzi的回复: voidswap1(intp,intq)//不能。参数是两个新的变量,结果只交换了p,q的值 { inttemp; temp=p; p=q; q=temp; } voidswap2(int*p,int*q)可以。为局部变量*p,*q分配空间,并让他们等于实参p,q的地址 { int*temp; *temp=*p; *p=*q;p(形参)=… 说的很清楚了。
#41
第4个能 第一个c++在编译时生成了两个新的局部变量,p和q,这时你交换了两个数只是交换了p和q,当swap1()执行完时,p和q又被编译器删除了。
#42
理解指针变量存的是地址,一般存的是值
#43
3 4
#44
4是对的.多把指针参数传递和值传递看一看吧.
#45
引用36楼operatingtuzi的回复: voidswap1(intp,intq)//不能。参数是两个新的变量,结果只交换了p,q的值 { inttemp; temp=p; p=q; q=temp; } voidswap2(int*p,int*q)可以。为局部变量*p,*q分配空间,并让他们等于实参p,q的地址 { int*temp; *temp=*p; *p=*q;p(形参)=… 不错
#46
2.4
#47
MARK PS: 我的目标是---->

^_^
#48
引用18楼fhtingtian的回复: 1是传值调用,在1内部p,q的值确实交换了,但是它们是局部变量,不会影响到主函数中的p和q; 3是和1类似的,原理相同。只是试图交换的对象换成了指针。 2本身是错误的,指针没有分配空间,不能直接赋值。若将int*temp;改为int*temp=newint;也是可以的 4是引用调用。 .
#49
2要报错的 编译的时候出现 voidswap2(int*p,int*q) { int*temp; *temp=*p;//warningC4700:localvariable'temp'usedwithouthavingbeeninitialized *p=*q; *q=*temp; } 没有为temp开辟指针 temp会随机的指向一块内存 temp程序不报错是运气,八层是要爆了
#50
ding