2.4 可見度
本文講的是c語言程式設計高階教程一2.4 可見度,每當乙個函式被呼叫的時候,乙個新的棧幀就被壓入呼叫棧。函式只能看到它自己的棧幀。考慮下面的兩個例子:
這兩個程式是完全相同的。把f1中的實參k和m重新命名為a和b不會起任何作用。呼叫棧是怎樣的呢?以下是在第乙個例子中當f1被呼叫時的呼叫棧:
第二個例子中的呼叫棧是相同的,只是棧幀f1中的實參有了不同的標誌符而已。要注意位址是相同的。第二個例子強調了在f1中的a和b與f2中的a和b指代的是不同的位址–值對。下面是呼叫棧:
f1棧幀中的a和f2棧幀中的a沒有任何關係。將a重新命名為k對程式的行為不會造成什麼不同。同樣的規則也適用於b。要記住計算機不知道標誌符。計算機只是使用位址和值。標誌符只是對讀**的人有用,當程式被編譯成機器可讀格式的時候就被捨棄了。
這可能在學生中會造成困惑。憑直覺來看,似乎f1棧幀中的a和f2棧幀中的a是相關的。事實上,它們在棧記憶體中佔據著不同的位置且是不相關的。下面的例子提供了進一步的解釋:
下表顯示的是當程式已經輸入f1但是還未執行第3行時的棧記憶體:
在第3行被執行之後,呼叫棧將會像下表中那樣。注意函式f1只是修改在它的棧幀中的變數a,因為乙個函式只能看見它自己棧幀中的實參和變數。
下表顯示了在程式執行第4行之後的棧記憶體:
函式f1返回a+b,即17+4=21。值21被寫入在位址102(即值位址)的值。在f1返回之後,棧記憶體如下:
棧幀 標誌符 位址 值
注意在f2中a和b的值沒有改變。
雖然相同的標誌符可能會出現在不同的棧幀中,但同樣的名字卻不能在相同的棧幀中被定義兩次。下面的程式是無效的,因為a在乙個函式中被同時用作實參和區域性變數:
回顧一下,本章解釋了棧記憶體的概念,它在函式被呼叫時會用到。棧記憶體為每乙個函式儲存返回位置、值位址、實參和區域性變數。
C語言及程式設計高階例程 24 查詢問題及其求解
賀老師教學鏈結 c語言及程式設計高階 本課講解 順序查詢 include define size 10 int main 也可以通過鍵盤輸入等方式給出資料 int i int key key表示待查詢資料 int index 1 用index表示查詢結果 關鍵字key出現的位置 printf inp...
C語言及程式設計高階例程 24 查詢問題及其求解
賀老師教學鏈結 c語言及程式設計高階 本課講解 順序查詢 include define size 10 int main 也可以通過鍵盤輸入等方式給出資料 int i int key key表示待查詢資料 int index 1 用index表示查詢結果 關鍵字key出現的位置 printf inp...
《C語言程式設計》一 2 4 資料的輸出和輸入
c語言中資料的輸出和輸入是通過呼叫函式實現的。scanf 函式實現鍵盤輸入,printf 函式實現螢幕輸出,這兩個函式由系統stdio.h庫函式提供。呼叫scanf 函式和printf 函式實現輸入 輸出時,應根據資料的型別和輸入 輸出的形式,通過格式控制來實現。1 printf 函式一般格式 pr...