重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)
int swap(int *a,int *b)//a與b分別復(fù)制主函數(shù)x與y的值,即a與x的指向相同,b與y的指向相同
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)與策劃設(shè)計(jì),汾陽(yáng)網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:汾陽(yáng)等地區(qū)。汾陽(yáng)做網(wǎng)站價(jià)格咨詢:028-86922220
{
int *t;
{t=a;a=b;b=t;}//通過(guò)交換,a和y的指向相同,b與x的指向相同,但是,x與y沒(méi)有改變?cè)瓉?lái)指向,這樣函數(shù)swap結(jié)束,a與b消失,輸出結(jié)果不變
}
換成
int t;
{t=*a;*a=*b;*b=t;}//將改變x和y指向的地址的值,達(dá)到交換目的
解答:
1.??? 注意形式參數(shù)和實(shí)際參數(shù)的區(qū)別,主函數(shù)中的x,y是實(shí)際參數(shù),swap函數(shù)中的a,b是形式參數(shù)。他們各有自己的存儲(chǔ)空間,互不干擾。
2.??? 在程序適當(dāng)位置加上輸出地址的語(yǔ)句,即可看出為什么回到主程序后,x,y的值為什么不交換。
為了更形象,可以用圖表示它們的關(guān)系:
可見(jiàn),交換的只是swap函數(shù)中的a,b值,對(duì)主函數(shù)中的a,b值沒(méi)有影響。
3. ? ?修改的方法,將swap的交換變成值的交換。
#includestdio.h
void?mswap(int?*p1,?int*?p2);//在前邊聲明一下函數(shù)
int?main()
{
int?a,?b,?*pa,?*pb,?swap(int?p1,?int?p2);
scanf("%d%d",?a,?b);
pa?=?a;? /*指針pa指向整數(shù)a*/
pb?=?b;? /*指針pb指向整數(shù)b*/
printf("a=%d,b=%d\n",?a,?b);
mswap(pa,?pb);? /*調(diào)用函數(shù)swap,實(shí)參為指針*/
printf("a=%d,b=%d\n",?a,?b);
return?0;//int?main()
}
void?mswap(int?*p1,?int*?p2)
{
int??t;
t?=?*p1;?*p1?=?*p2;?*p2?=?t;
}
我用的vs2013,貌似系統(tǒng)自帶swap,會(huì)報(bào)錯(cuò)。所以把函數(shù)名改成了mswap
這個(gè)地方會(huì)出現(xiàn)不好理解的東西。
調(diào)用函數(shù)的時(shí)候,你放入了int
a
int
b
但是這其實(shí)不是你的main函數(shù)中的a
b只是相當(dāng)于他們的副本,也就是復(fù)制了一個(gè)a
和b
傳入函數(shù)
所以你改變的只是傳入的副本
也就是復(fù)制的副本a
b所以在main函數(shù)中打印的ab不會(huì)出現(xiàn)變化
依然是a=3,b=6
現(xiàn)在回答第二個(gè)問(wèn)題,怎么會(huì)讓ab的值變化:傳入指針,也就是在main函數(shù)中使用a
b的指針,然后吧指針傳入到函數(shù)里面
這個(gè)時(shí)候ab就會(huì)真正的發(fā)生變化,因?yàn)橹羔樦赶虻氖莂b的物理地址,也就是真正的ab,不是副本,這個(gè)時(shí)候就會(huì)改變ab的值。想要理解,可以去百度傳值參數(shù)和引用參數(shù)。純手打,望采納
你想通過(guò)傳遞變量地址(即指針)來(lái)調(diào)用子函數(shù),實(shí)現(xiàn)改變變量的值。
這樣是做不到的,就像為什么不能通過(guò)直接交換形參改變變量的值一樣,你把傳來(lái)的指針(即變量地址)直接交換,并不會(huì)對(duì)main里面的p和q起作用,就是main里面的地址值實(shí)際上并沒(méi)有交換(你可以用%p打印地址看一下),正確的做法是通過(guò)傳來(lái)的地址,改變對(duì)應(yīng)地址里面的值:
#include stdio.h
void swap(int *a,int *b)
{
int t;
t=*a;*a=*b;*b=t;
}
main()
{
int i=3,j=5,*p=i,*q=j;
swap(p,q);
printf("%d %d\n",*p,*q);
}