C語言中,函數參數只能傳值。與傳值對應的是傳引用,C語言不支持函數參數傳引用,C++語言才支持。
成都創新互聯服務項目包括塔河網站建設、塔河網站制作、塔河網頁制作以及塔河網絡營銷策劃等。多年來,我們專注于互聯網行業,利用自身積累的技術優勢、行業經驗、深度合作伙伴關系等,向廣大中小型企業、政府機構等提供互聯網行業的解決方案,塔河網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到塔河省份的部分城市,未來相信會繼續擴大服務區域并繼續獲得客戶的支持與信任!
C++傳引用函數:
void foo(int a) { a = 3; }
假如a = 2,執行foo(a)后,a = 3。
---
C語言可以模擬傳引用,方法是通過指針來實現:
void foo2(int* ap) { *ap = 3; }
假如a = 2,執行foo2(a)后,a = 3
foo2(a)調用本質上仍然是傳值,只不過傳遞的是指針,指針即是地址,地址本質上是一個無符號整數。
如果:
void foo3(int b) { b = 3; }
假如a = 2,執行foo3(a)后,a = 2。這是因為foo3(a)調用過程中,a值傳給形參b,修改b的值與實參a無關。
注意到,foo3(a)與上述foo(a)傳引用的調用是形式一樣的。
既然C語言通過指針可以實現傳引用調用,為什么C++還要引入引用這個特性呢?這是因為C++引入的很多新特性需借助引用來實現,比如,拷貝構造函數等等。
你要用*去解引用,這樣才能改變指針指向內存的值。
你的swap函數寫的有問題,正確的寫法有人給了。
至于為什么*x,*y的值沒有改變,因為你交換的是2個形參的值,雖然你傳入的是指針,但是你沒有把它們當成指針來用,最后的結果跟傳非指針值是一樣的。
如果想真正改變實參的值,就必須交換指針指向的內存,而不是單純交換指針變量本身。形參是通過堆棧傳遞的,只有用類似 *x = 1;這樣的語句操作指針指向的內存,才能影響到實參,否則實參的值是不會改變的。
其實最好的方式就是去VS里調試運行,仔細觀察運行過程,就能比較清晰地了解指針。單純的理論是站不住腳的,拉出來溜溜就一清二楚了。
想對你能有幫助。
*s表示變量m本身,對*s的賦值就是對m賦值,所以*s=a[p]是正確的。
請注意,函數fun中的s變量是一個地址,只對該地址進行重新賦值,并不對其所指向的變量m造成影響。所以s=a[p]不改變main函數中m變量的值。
如果把*s=a[p]改為s=a[p],輸出會是亂碼。這具有很大的迷惑性,使人以為地址的賦值過程出現了問題。實際上,若把m改為全局變量(全局變量中字符串默認為空,int變量默認為0):
#includestdio.h
#includestring.h
#define?N?10
typedef?struct?ss
{
char?num[10];
int?s;
}STU;
void?fun(STU?a[],STU?*s)
{
int?t,p=0;
t=a[0].s;
for(int?i=1;iN;i++)
{
if(ta[i].s)
{
t=a[i].s;
p=i;
}
}
s=a[p];?????//這里是錯誤的語句
}
STU?m;
void?main()
{
STU?a[N]={
{"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
{"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
};
printf("the?original?data?is?:\n");
for(int?i=0;iN;i++)
{
printf("NO=%s?MARK=%d\n",a[i].num,a[i].s);
}
fun(a,m);
printf("the?lowest?is?%s??who's?score?is?%d\n",m.num,m.s);
}
輸出的將會是the lowest is???who's score is 0
這說明變量m的值并未改變過。
事實上,若非要使用符號,正確的方法是使用“引用”:
#includestdio.h
#includestring.h
#define?N?10
typedef?struct?ss
{
char?num[10];
int?s;
}STU;
void?fun(STU?a[],STU?s)
{
int?t,p=0;
t=a[0].s;
for(int?i=1;iN;i++)
{
if(ta[i].s)
{
t=a[i].s;
p=i;
}
}
s=a[p];
}
void?main()
{
STU?a[N]={
{"A01",81},{"A02",81},{"A03",81},{"A04",81},{"A05",81},
{"A06",81},{"A07",81},{"A08",61},{"A09",81},{"A010",81}
},m;
printf("the?original?data?is?:\n");
for(int?i=0;iN;i++)
{
printf("NO=%s?MARK=%d\n",a[i].num,a[i].s);
}
fun(a,m);
printf("the?lowest?is?%s??who's?score?is?%d\n",m.num,m.s);
}
這里的意思是“引用”,你可以百度上搜索C++中符號的兩個意義。
如果想把在子函數中的數據操作變化反應到主函數中的相應變量上,則在主函數中一定要傳遞這個變量的地址,不要管這個變量是什么類型!!
struct BiTree*a; //這里定義一個變量a , 它的類型是個結構體指針
creatBiTree(a); //這里是將a的地址傳遞到子函數中,這樣,子函數中,通過對a變量的地址的操作,實現了a本身的值的變化!!
void creatBiTree(struct BiTree**root) //這里形參是**,是因為a是指針,a的地址還是個指針,因此要是二維指針類型,這是與a的類型相關的!
如果改成(struct BiTree *root) , 主函數中 creatBiTree(a); //寫成這樣編譯會報參數類型錯誤, creatBiTree(a); //則root在子函數中的變化,不能反應到a上!!root和a僅是在數值上相等的兩個不同的數據!
首先需要聲明函數指針的類型(下例子中的typedef int (*fpFunt)(int a,int b),再定義某個函數(下例中的Add),在其參數列表中使用該函數指針類型,同時需要定義另一函數(下例中的fpAdd,注意該函數形式要和fpFunt一致,本例子中是返回一個整數,兩個整型參數)作為實參用。這里在手機上使用易歷知食軟件內的微C程序設計來編程,舉個兩個數相加的例子,代碼如下圖:
調用后運行結果如下圖:
改成下面代碼看看:
#include?stdio.h
void?abc(int?*i,int?*j)
{
int?m;
m=*i;?//指針變量的值也就是地址不能賦值給一般變量
*i=*j;//*i,*j才是指針變量指向的變量的值
*j=m;???
}
void?main()
{
int?a,b;
int?*pa=a,*pb=b;
printf("請輸入a,b的值:");
scanf("%d,%d",a,b);
abc(pa,pb);??//
printf("a=%d\tb=%d\n",a,b);
}
文章題目:c語言里指針作為函數形參,用指針作為函數參數,編寫函數fun
標題網址:http://m.newbst.com/article32/phhepc.html
成都網站建設公司_創新互聯,為您提供網站營銷、企業網站制作、定制網站、微信公眾號、自適應網站、網站策劃
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯