printf()引數傳遞實質是通過乙個叫堆疊的東西進行,為了讓大家對我的敘述有個直觀的理解:(先看看乙個圖)
不知道大家看明白這個用%ld來列印出的這個結果的問題沒,是不是%ld不能用來列印乙個float或者double型別的值呢?答案是可以列印,那為什麼會列印為完全錯誤的值呢?這就與printf函式的引數傳遞就有關係了。下面我將詳細的敘述這個過程:
首先,變數將值傳給計算機,計算機把它們放置到被稱為堆疊(stack)的一塊記憶體區域中來。計算機根據變數的型別而非轉換說明符(like %c %f)把這些值放到堆疊中。
然後,識別符號根據讀取資料的型別在stack中讀取,並列印出來。
以上說明了引數傳遞的過程,接下來就上的列印錯誤再來解釋下為什麼會列印錯誤,float型別會以double型別放入stack中,佔8位元組(byte)。long int 佔4個位元組(byte)。在中,出現是第乙個0是由於第乙個%ld讀取了變數a在stack中前4個位元組的值,這樣本來應該顯示float型別,結果讀為了long int 型別,所以出現了錯誤。第二個數字是變數a的後4個位元組的值,並且以long int型別列印了出來,第三個數字0則是識別符號讀取了b這個變數的前4個位元組,第四個數字則是變數b的後四個位元組,最終的結果便是c和d這兩個變數沒有被列印,雖然它們使用了正確的標示符來列印結果,然而也沒有列印出來。
對應於下圖中的a,b,c,d這四個變數。
函式的引數傳遞
一 函式引數傳遞機制的基本理論 函式引數傳遞機制問題在本質上是呼叫函式 過程 和被呼叫函式 過程 在呼叫發生時進行通訊的方法問題。基本的引數傳遞機制有兩種 值傳遞和 引用傳遞 以下討論稱呼叫其他函式的函式為主調函式,被呼叫的函式為被調函式。值傳遞 passl by value 過程中,被調函式的形式...
函式的引數傳遞
def func a 1,b 2,c 3 形參有預設值 print a,b,c func func 4,5,6 func 5,6 func 7 func a 8 func a 9,b 10 func 11,c 12 func 11,a 12 和func a 12,13 是錯誤的 def calcsu...
函式引數的傳遞
先來幾道題壓壓驚先 第一題 void exchg1 int x,int y int main void 問題是x y a b 第二題 void exchg2 int px,int py int main void 問題是 px py a b 第三題 void exchg3 int x,int y i...