c語言的傳值與傳指標的問題,大一c語言題目,形參實參與指標的問題

時間 2021-05-05 13:42:52

1樓:星月小木木

c語言中指標即位址,位址的傳值可以引起引數的變化。

比如:&x, &y是取這兩個變數的位址,作用空間在main函式裡。然後函式呼叫把這兩個變數的位址傳遞到函式myadd中,在函式中的*a和*b分別是引用位址指向的變數值,等於是取到了x,y本身的值。

在myadd中直接操作*a可以改變x的值。

通俗來說因為&x,&y表示的是x,y的位址。所以傳遞的是位址。意思就是說,函式可以通過位址引用變數。

2樓:大林因

其實簡單來說, 如果createdata()和print()這二個函式是正確的, 你只要分別看一下createdata()和print()的函式原型:

1. int createdata(lcountry *head): 它的輸入引數型別是 lcountry *, 也就是country **, 而 "head"是country *型, 所以傳給createdata時, 應該取 &head, 也即為 country **型.

2. void print(country* p): 它的輸入引數型別就是country *, 而 "head"正是country *型, 所以只要給它傳 "head"就可以.

3. "head"和"&head"都是指標, 都是位址, "head"是"*head"的位址, 而"&head"是"head"的位址.

3樓:

createdata(&head)之所以需要雙重的指標,是因為這個函式是將引數作為輸出,而記憶體分配本來就是需要乙個指標的,而且它是在函式體內分配的。如:s=(country*)malloc(sizeof(struct country)),如果想作為輸出的話,所以存入引數時必須取它的位址(也就是傳入指向s的指標,這就成了雙重指標了)。

如果你直接返回head的話,你就不能引用在函式體內的記憶體了,由於createdata函式是在函式體內分配記憶體的,也即是是棧記憶體,函式執行完就會被釋放了,如果直接傳入head而不是&head,並返回head就會引用無效記憶體。舉個例子:

//這樣使用正確

#include

void get(char **p)//雙重指標;int main()

/********下面的是錯誤的**********/#include

void get(char *p)//單指標;int main()

希望能幫到你

4樓:

createdata(&head) 這裡傳的是雙重指標,剛好和形參是匹配的。形式引數必需用雙重指標的原因是外層指標是值傳遞的是不可以修改的,現在要修改內層指標當然只能傳雙重指標了。

你這個 createdata的原理就是建立一些資料實體(並且連城鍊表),然後將第乙個資料實體的指標傳出來。因為你要傳的是指標,當然只能是指標的指標來作形參構成引用傳遞了

5樓:雙魚座大叔

createdata(lcountry *head) //如果只是傳指標,那是形參,不會修改指標所指向的內容,傳指標的位址,就可以修改指標指向的內容

print(head);//這裡傳形參就可以,不涉及到修改指標,只是列印指標指向的內容

大一c語言題目,形參實參與指標的問題

6樓:風雷九州

c語言使用的是值傳遞,僅僅將實參的值傳遞給形參。

對於第一種寫法

main函式傳遞給swap函式的是&a和&b的值,即a和b所在的位址的值

那麼swap函式裡面通過*x來更改的就是&a所在的位址裡面的值,也就是a本身的值了,所以第一種寫法main函式呼叫swap函式之後,a和b的值會發生互換。

對於第二種寫法

main函式傳遞給swap函式的是a和b的值,即只是將15和8傳遞給了swap函式

那麼swap函式裡面更改15和8,和main函式的a和b沒有啥關係的,所以第二種寫法main函式呼叫swap函式之後,a和b的值不會發生互換。swap函式只是更改了x和y的值,對a和b沒有什麼影響

這就是c語言引數的值傳遞的奇妙之處了。

7樓:匿名使用者

首先理解值傳遞和位址傳遞的區別。

第二個程式就是值傳遞。實參a的值傳給形參x,實參b的值傳給形參y。這裡的x與a只是值相等了,但是兩個不同的記憶體單元。

好比一班和二班兩位同學,只是名字都叫張三,卻是兩個不同的人。同理,b和y也類似於一班和二班另兩位同學,只是名字都叫李四,卻是不同的兩人。在swap函式中,只是對x和y操作,類似於只是二班的張三和李四發生了點變化。

他們的變化是不會影響一班的張三和李四的。所以x和y的變化不會影響a和b。因為這是四個不同的記憶體單元。

第乙個程式是位址傳遞。實參&a(a的位址)傳給形參x,實參&b(b的位址)傳給形參y。這樣的話,x就指向了a,y也指向了b。

**中temp=*x;就等價於temp=a;了。 同理,*x=*y; 等價於a=b; *y=temp;等價於b=temp; 。這裡對*x和*y操作,實際上就是對a和b的操作。

所以會影響a和b的值。

8樓:匿名使用者

第二個交換了x和y,對a和b沒有影響,因為形參和實參的記憶體位址是不一樣的

第乙個交換了a和b的位址所指向的內容,所以交換有效

9樓:

函式形參一定要傳遞位址,呼叫過程中改變形參的值,不會影響實參變數本身,實參變數保持值不變,下面的寫法輸出的形參值不會改變。上面寫法形參值改變實參。

求c語言程式引數的傳值方式與傳位址方式編

include void value double r1,double r2,double bing,double chuan int main 下面提供乙個程式 供參考 include 計算併聯電阻,其中jieguo以引用傳遞,函式中修改後,直接改變原來的數值 r1,r2以數值的方式傳遞 計算串聯...

c語言 中 ab 的值?C語言中如何求a b的值!

a的ascii碼是10進製的97,16進製制的61,b的ascii碼是10進製的98,16進製制的62,順序寫到一起是16進製制的6162,轉換為10進製就是24930。ab 占用2個位元組 字面上是這樣 賦給int型別變數在某些編譯器 如dev c 中是可能的,但沒有推廣價值,也公尺有應用價值,所...

c語言求陣列總最大值與最小值

3全部int a 10 i,min a 0 max a 0 此處a 0 尚未初始化,max與min成為乙個隨機數 修改後如下 include int main else if a i min min a i printf d,d min,max return 0 max和min的初值不確定。因為定義...