傳值調用編譯原理
『壹』 那位大俠幫解答一下,傳址方式,傳值方式的問題
這是一個關於值傳遞和地址傳遞的問題,是程序編譯器中的常見問題。
首先說一下參數傳遞的方式,一般有5種方法(上學時候學的,現在只記得4種了)分別是 值傳遞、地址傳遞、值地址傳遞、名字傳遞、還有一個忘了。
參數傳遞的方法是將數值存放到寄存器中,然後再通過調用寄存器來改變參數。值傳遞是不管寄存器的地址,只對數值做修改。
所以值傳遞是只傳數值,但是主程序中的數值不隨子程序變化而變化。
{
子程序:
a=1,b=2;
}
{
主程序:
a=2,b=2;
call 子程序();
n=a+b;
}
結果n=4
地址傳遞是將數值所在的寄存器的地址記錄下來,子程序對地址進行修改,從而改變主程序中的數值。
在你的程序中,byval是借用value方法出的數據,所以子程序中修改的數據仍然存放在原來的位置,而主程序調用子程序時候是尋找子程序中參數所在的寄存器,值傳遞不改變寄存器的地址,所以主程序取不到想要得到的值。
byref是借用ruffer,是通過緩沖區調用子程序中n的所在寄存器的地址,然後把這個地址中的數值引入到主程序中進行計算,所以地址傳遞改變主程序結果。地址傳遞可以想像成一個堆棧,n是棧中的數值,而主程序取出來的n所在棧的地址,把這個地址告訴主程序的命令,從這個地址中取需要計算c的數值,然後再進行計算。
可能表達也不很清楚,如果想多了解一些這方面的東西的話可以找一些關於編譯原理方面的書,簡而言之記住一點,值傳遞是保護主程序數據不被隨意修改的方法,所以不可能改變主程序的結果,如果要修改主程序的結果,必須用地址傳遞。
『貳』 在C語言中,定義一個函數的形參和實參之間具體是如何進行參數傳遞的
傳值調用和引用調用傳值調用和引用調用指的是用於參數傳遞過程中的一種機制。傳值調用中,只使用了實參的值。傳值調用機制里,形參是一個局部變數,其初始值為相應實參的值。在引用調用機制里,將實參的地址傳遞給形參,從表面上看是以實參變數取代形參,因此任何發生在形參上的改變實際上都發生在實參變數上。
形參的作用是實現主調函數與被調函數之間的聯系,通常將函數所處理的數據,影響函數功能的因素或者函數處理的結果作為形參。沒有形參的函數在形參表的位置應該寫void.main
函數也可以有形參和返回值,其形參也稱為命令行參數,由操作系統在啟動程序時初始化,其返回值傳遞給操作系統。
形參和實參的對照實例(C語言版)main(){int
n;printf("input
number
\n");scanf("%d",&n);s(n);printf("n=%d\n",n);}int
s(int
n){int
i;for(i=n-1;i>=1;i--)n=n+i;printf("n=%d\n",n);}
『叄』 如何區分傳值與傳址
區別:對形參的影響不同
1、在譽改傳值中函數參數壓棧的是參數的副本,任何的修改是在副本上作用,沒有作用在原來的變數上。
2、傳址中壓棧的是指針變數的副本,當你對指針解指針操作時,其值是指向原來的那個變數,所以對原來變數操作。
(3)傳值調用編譯原理擴展閱讀
函數傳參有三種傳參方式:傳值、傳址、傳引用。
1、按值傳遞
(1)形參和實參各佔一個獨立的存儲空間。
(2)形參的存儲空間是函數被調用時才分配的,調用開始戚虛殲,系統為形參開辟高沖一個臨時的存儲區,然後將各實參傳遞給形參,這是形參就得到了實參的值。
2、地址傳遞
地址傳遞與值傳遞的不同在於,它把實參的存儲地址傳送給形參,使得形參指針和實參指針指向同一塊地址。因此,被調用函數中對形參指針所指向的地址中內容的任何改變都會影響到實參。
3、引用傳遞
引用傳遞是以引用為參數,則既可以使得對形參的任何操作都能改變相應數據,又使函數調用方便。引用傳遞是在形參調用前加入引用運算符「&」。
引用為實參的別名,和實參是同一個變數,則他們的值也相同,該引用改變則它的實參也改變。