《C語言程式設計高階教程》一2 4 可見度

2021-09-23 03:10:17 字數 1606 閱讀 3671

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