当前位置 : 主页 > 网络编程 > 其它编程 >

下面四个函数哪个能够成功作两个数的交换

来源:互联网 收集:自由互联 发布时间:2023-07-02
下面四个函数哪个能够成功作两个数的交换?这里头涉及传值和传址的问题我比较混乱请大家讲讲原理~~~#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
网友评论