㈠ c語言,參數處理的方式
C語言中函數參數的傳遞有:值傳遞、地址傳遞、引用傳遞這三種形式。
值傳遞:作為參數的變數,傳遞給函數執行後,自己的變數值是不變的。它(實參)僅僅只是把值賦給了形參,自己實際上是沒有參與函數運算的,參與的是形參,這個就是參數的值傳遞。
地址傳遞:即採用指針方式,地址傳遞跟值傳遞沒什麼不同,值傳遞是把變數的值傳遞給形參去參與函數運算,而地址傳遞則把變數的地址傳遞給形參去參與函數運算。當然,如果函數改變了變數地址的值,實參的值也會變化的。
引用傳遞:引用傳遞的調用方式與值傳遞一樣的,但形參則引用了實參,在函數里頭操作的是實參,而不是像上面兩種操作形參那樣。傳引用相當於給原來變數起了另一個名字而已,這樣函數可以直接修改實參的值了。
㈡ 在c語言中怎樣使形參值改變實參值也跟著改變
在C裡面 是無法做到形參改變 實參值同步改變的。
只能通過傳地址的方式
即參數類型為指針
這樣 形參指向空間修改,可以使得實參指向空間同步修改,因為是同一塊內存區域。
另外,在C++中,可以通過引用傳參,來實現你說的目的。
㈢ c語言中函數可否改變參數值
#include
void
foo(int
x,
int
y,
int
z)
{
printf("x
=
%d
at
[%x]n",
x,
&x);
printf("y
=
%d
at
[%x]n",
y,
&y);
printf("z
=
%d
at
[%x]n",
z,
&z);
}
int
main(int
argc,
char
*argv[])
{
foo(100,
200,
300);
return
0;
}
運行結果:
x
=
100
at
[bfe28760]
y
=
200
at
[bfe28764]
z
=
300
at
[bfe28768]
c程序棧底為高地址,棧頂為低地址,因此上面的實例可以說明函數參數入棧順序的確是從右至左的。可到底為什麼呢?查了一直些文獻得知,參數入棧順序是和具體編譯器實現相關的。比如,pascal語言中參數就是從左到右入棧的,有些語言中還可以通過修飾符進行指定,如visual
c++.即然兩種方式都可以,為什麼c語言要選擇從右至左呢?
進一步發現,pascal語言不支持可變長參數,而c語言支持這種特色,正是這個原因使得c語言函數參數入棧順序為從右至左。具體原因為:c方式參數入棧順序(從右至左)的好處就是可以動態變化參數個數。通過棧堆分析可知,自左向右的入棧方式,最前面的參數被壓在棧底。除非知道參數個數,否則是無法通過棧指針的相對位移求得最左邊的參數。這樣就變成了左邊參數的個數不確定,正好和動態參數個數的方向相反。
因此,c語言函數參數採用自右向左的入棧順序,主要原因是為了支持可變長參數形式。換句話說,如果不支持這個特色,c語言完全和pascal一樣,採用自左向右的參數入棧方式
㈣ C語言中,簡單變數作為參數,調用函數數後,什麼時候值改變,什麼時候不變
常規類型(int、double、float、char等)的都不會變
指針類型(int*、double*、float*,char*等)的都會變
數組類型(int[]、double[]、float[],char[])的也都會變
類也會變(c++范疇)
總而言之:參數指向值的,都不會變;參數指向地址的都會變(數組也是指向地址的。可以理解為本質也是指針)