c語言中關於陣列名作為函式引數方面的問題

2021-03-27 22:07:21 字數 2905 閱讀 1023

1樓:匿名使用者

不知道你說的第2,4,5語句對應的是什麼。。。。

幫你解釋為什麼是1:

當你呼叫fun(a,b,s);

傳進的引數實際上是:&a[0], &b[0], s變數的值(實際上也就是&a[0])

現在我們把fun的形參換個名字  fun(int *p1, int *p2, int *p3)

進入fun時 p3 = s ,即p3 = &a[0].

你呼叫malloc時返回的值是一個int*,實際上 p3 = malloc返回的新指標p4

*p3=*p1+*(p2++)   即  *p4=*p1+*(p2++);

看到錯誤了嗎,p4並不是s,你算出來的值賦值到malloc返回的指標p4指向的記憶體了。

你想p3(即你的s)拿到計算的值,請把s=(int*)malloc(sizeof(int) );這句去掉。

另外malloc出來的記憶體是需要釋放的,請呼叫free釋放,不然程式不退出的情況下記憶體會佔用。

2樓:白花戀歌

因為c語言函式採用的是傳值呼叫,指標作引數時傳遞給函式的我們給個命名比如s',這時s'==s,然後申請了一塊動態記憶體,申請成功的話會把指標傳遞給s',然後*s『=*p1+*(p2++),所以。。。會產生記憶體洩漏。。。還有就是申請動態記憶體之後一定要檢查申請記憶體是否成功,加一個null判斷

至於你說的第二句和第四句不知道你說的是什麼,以上都是猜測,你參考下吧至於s,它一直指向的是a[0],沒有變過

你要改的話就直接刪除掉動態記憶體那一句,這樣的話,s和s'都是指向a[0]的,當a[0]改變了的時候,s讀取那段記憶體也會得到改變後的值,不過這樣的話a[0]也會由1變成11

3樓:主從報警系統

主程式中的s和fun程式中的s完全是兩個毫不相關的指標變數,你可以看成是int *s_m和int *s_f

s_m指標在fun程式呼叫的那一時刻出來打了下醬油(用來賦值給s_f:s_f = s_m;),後來在fun程式體中:s=(int*)malloc(sizeof(int) ); 這一句的時候,s_m被拋棄了,此時s_f 指向新申請的動態空間了。

4樓:寂寞土人

s=(int*)malloc(sizeof(int)這句分配了一個動態地址,所以已經把指向改變。所以執行fun函式後s的值沒變

c語言中,陣列名作為函式引數,屬於什麼傳遞,為什麼?

5樓:行了我

c語言中,陣列名作為函式引數,屬於陣列引數傳遞。在vb6.0中,允許使用陣列作為實參傳遞到子過程的形參中,陣列傳遞必須採用地址傳遞的方式來傳遞引數。

陣列型變數名本身只是該陣列所佔儲存空間的首地址,函式呼叫時,系統不會為形參分配陣列儲存空間,而是僅僅分配一個存放陣列地址(第一個元素地址)的儲存空間,此後,將實引數組的首地址傳遞給形參變數。

6樓:膽市倨

屬於地址傳遞,在函式裡修改的話,將直接影響呼叫方的數值。這是因為陣列名代表這個陣列的首地址,不過是靜態不可更改的而已。在函式裡用引用[i]下標時,就是找到這個陣列第i號元素的地址進行修改的。

所以是第於是地址傳遞。

7樓:匿名使用者

你要記住,所有傳遞給函式的引數都是通過值傳遞方式進行的。陣列名作為函式引數也不例外。

c語言中陣列名作為函式引數

8樓:閲庢瘮餜槂

因為你從主函式傳過來之後,是給了a[10]啊,與arrlen無關啊,而且在呼叫函式時是會給區域性變數重新分配記憶體,但這也只是說原先那個記憶體消失了,那麼記憶體裡面的值也會消失了,就會重新執行rrlen=sizeof(a)/4

9樓:毛夏止雨

函式定義和宣告的引數應該是:

intoid_check(struct

snmp_seq

sp,struct

rmc1207

*ramp,

intbuffer_size);

函式呼叫:

flag=oid_check(sp,

ramp,

buffer_size);

在這裡,

ramp

是結構體陣列的指標

c語言中陣列名作為引數有什麼特點

10樓:倒黴熊

陣列名作為引數,在引數的傳遞中 會退化為指標,也就是說 陣列名作為引數,傳遞的是陣列的首地址。

11樓:

陣列名相當於記憶體中 該陣列的首地址

c語言,陣列名作函式引數問題。

12樓:匿名使用者

肯定要考慮陣列大小啊,不然源陣列有5個元素,但你在被調函式中不知道陣列長度為5,對第6個元素進行了操作,就會發生錯誤了.

13樓:匿名使用者

這個..因為其實是一個指標嘛..不指定的話..你就不知道邊界了...

如果永遠做++的話..那麼陣列會按照型別所佔用的記憶體指下去..

14樓:匿名使用者

應為c語言的規則就是

先定義然後才能分配空間

15樓:匿名使用者

因為用陣列做引數會可以修改引數,不考慮大小的話會有越界..

16樓:匿名使用者

這道題剛剛做到了,正確答案是c

牛客網大佬給出的解答,a,必須在主調函式中說明此陣列的大小,不一定例如傳遞一個char型別的字串,就不需要。所以a是錯的

17樓:仁沉勤禾

a是陣列名,也就是陣列的首地址,a+1就是a[1]的地址,等價於&a[1].前面加一個星號就是取該地址的值啦,也就是元素a[1]的值。

C語言中陣列名作為實參傳給被呼叫的函式時,形參獲得的是什麼

在函式中,之所以陣列的值能夠被修改,就是因為形參得到的是陣列的地址,而不是資料,所以,行參獲得的應該是陣列的地址 把陣列作為引數傳遞給函式的時候,並非把整個陣列的內容傳遞進去,此時陣列退化為一個同型別的指標,這個指標的值就是陣列首元素的地址值。c語言中陣列來名作為實參傳給自 被呼叫的函bai數時,形...

C語言實引數組與形引數組問題,關於c語言中陣列作為函式引數的函式之間呼叫問題

這個問題是這樣的了,因為你的陣列定義的是二維大小是20 20 地址空間已經分配好了,而但你輸入的m和n的值小於20的時候,你只是先給第一維賦值,如果輸入的數字大於20,在對第二維賦值,但你輸入一些小的m和n時,其實二維陣列你還沒有賦值,他們的值還是你預設給的0啊,而當你用二維陣列去讀數的時候 a 0...

C語言中,用陣列名作形參和用指標作形參有區別嗎

還是有差別的 雖然大多數時候都可以相互用最大的差別就是指標可以改版變,可以通過指標改變指向內權容的值,但陣列名不行 舉個例子 分別作為形參 int num 10 p p num 此時p指向陣列的第一個元素我在主函式裡呼叫兩個函式 1 sum num 2 sum p 2,10 這就有區別了,因為num...