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...