還不快點登入,你們這些看小說都不登入就離開的。
登入可以幫助你收藏跟紀錄愛書,大叔的心血要多來支持。
不然管理員會難過。
《程序媛養成計劃》第36章 作用域(下)
  「被釋放掉了,為了證明這一點,我們在剛才的代碼中添加一句代碼,同時也向你們介紹&的第三個功能,取地址。
  int fieldArea()
  {
  int a = 100;
  for(int i = 0; i 10; i++)
  {
  int b = i;
  printf(“b 的地址是:%d“,&b);
  }
  }
  之前我們已經學過了&的兩種用法,一種是用於兩個數做位與運算,一種是用來做邏輯與,而這種放在一個變量的命前面的操作,叫做取地址。
  至於什麽叫地址,我簡單的說一下。
  最開始我給你們說過,電腦的最基本組成是成千上萬億個開關構成的,但是雖然都是開關,卻也分不同的類別,主要來說分為三種。
  第一種CPU,它是電腦的核心,它的裡面的開關狀態轉換速度非常快,但是造價也非常貴。
  第二種硬盤,就是我的電腦裡邊什麽C、D、E、F盤,用來保存文件,代碼這些。硬盤的開關狀態轉換就很慢了,好處是便宜。
  當我們要運行程序的時候,CPU需要從硬盤中讀取編譯成機器語言的.exe,但是硬盤的讀寫速度相對於CPU來說太慢了,根本沒有辦法讓它的效率得到有效的發揮。
  於是就引入了第三種——內存,內存的開關狀態轉換速度在CPU和硬盤中間,造價也是如此,所以它就作為了CPU和硬盤的一個緩衝介質。
  當CPU要從硬盤裡邊讀寫數據的時候,就讓內存先去加載,然後CPU再從內存中讀取。CPU在讀取內存裡面的數據時,內存又可以去硬盤中讀取後面的內容,這樣就形成了一個流水線,CPU的執行效率就大大提高了。
  所以,程序要正常運行,就需要依靠內存。一旦內存不夠用了,電腦就會變得特別卡,甚至於死機。你們看,桌面邊邊這個顯示百分比的圓球就是電腦管家顯示的內存使用情況。
  理論上來說,內存的容量越大,就可以開越多的程序,但是也不是越大越好。因為程序的執行是由CPU來調度的,假設CPU的極限是調度1000個程序,而內存的容量可以供1500個程序使用也是沒有意義的。
  現在主流的配置一般都會給電腦搭配16GB的內存,這是什麽概念呢?1GByte=1024MByte=1024x1024KByte=1024x1024x1024Byte。在最開始和你們說過,為了方便管理,8個開關被統一為一個字節(Byte),你們自己算算,這是有多少個字節。
  為了便於管理,開發計算機的那些科學家就給每一個字節編了一個號,而這個編號就叫內存地址。我們用&獲取的正是一個變量在內存中的地址。」
  老爹一邊說,還一邊將我的電腦機箱蓋子打開了,和我們介紹CPU、內存條和硬盤長什麽樣子。這些知識雖然看上去和編程沒有關系,但是卻在編程中起著舉足輕重的作用。
  老爹在介紹完了之後,我和小弦子將fieldArea函數給運行了一下,結果讓我傻眼了,因為10次打印出來變量b的地址居然是一樣的!
  我重複了運行了好幾次,雖然每次運行b的地址和上一次的不一樣,但是在這10次循環中的地址卻是一模一樣。
  再三檢查後,我確認不是自己的問題,於是看向了小弦子,看看他那邊是個什麽情況。
  結果小弦子的情況和我完全相同!這是什麽情況?難道是老爹講錯了?
  我和小弦子都看出了對方眼裡的疑惑,我們同時看向了老爹。
  老爹愣了一下,然後在看了我和小弦子程序運行結果後陷入了沉思。
  緊接著他在自己電腦上運行了一下,結果也是一樣的。
  「對不起,孩子們,這裡應該是我講錯了。從我讀大學那個時候就一直以為在for循環體裡面聲明的變量應該是每次都是重新生成的,謝謝你們糾正了這個錯誤。」
  說完,老爹鄭重地向我們道了歉。
  「有很多事情,一直便是如此不見得都是對的,就算是目見耳聞都不一定是真的,通過這件事你們也應該能夠看出來了。所以啊,我希望你們保持一顆質疑、求真的心。
  好了,咱們接著講作用域。變量的作用域除了通過大括號來判斷,還有幾種比較特殊的情況:
  第一種,for循環小括號中定義的變量。
  for(int i = 0; i 10; i++)
  {
  }
  這裡的變量i它的作用域就是整個for,所以我只能在for結構內使用它,一旦脫離for的作用域,它就被釋放了。
  第二種,聲明在所有函數外面的變量。
  int global = 100;
  int main(int argv, char nst* args[])
  {
  }
  int func(void)
  {}
  這裡的global變量它在所有的函數外面,所以當前.c文件中所有的函數都可以使用它。
  還有一點比較重要的東西:如果一個變量的作用域內還有其他的作用域,那麽在這個作用域裡面也是也是用這個變量的。
  舉個例子,區長的作用域是整個郫都區,而紅光鎮是在郫都區內,所以區長自然可以管理紅光鎮的事務。
  這也解釋了為什麽global能夠被當前.c文件裡的所有函數使用,因為這些函數的范圍在global作用域中。
  那麽剛剛main和add中都存在名為sum的變量問題也解決了,因為這兩個sum根本就在是各種的作用域中聲明的。其實重點是在同一個作用域中聲明同名變量,注意, 是聲明,而不是不能有,這點一定要注意!
  也就是說下面這種是不行的
  void func(void)
  {
  int a = 10;
  int a = 10;
  }
  而下面兩種是可以的:
  void funcA(void)
  {
  int a = 10;
  }
  void funcB(void)
  {
  int b = 10;
  }
  或者這種也是可以的:
  int a = 10;
  void funcD(void)
  {
  int a = 20;
  }
  一下子和你們說了這麽多,估計你們很難理解,不過只要多看看,再結合實際運用,應該就能夠理解了。
  簡單的來說,作用域你可以理解為一個變量的地盤,當要用這個變量的時候在這個變量的地盤中,那就沒有問題,如果不在這個變量的地盤中,那就不能使用。
  還有就是無論什麽時候都不能讓電腦疑惑,就像一個作用域中你如果聲明了兩個名字相同的變量,計算機就懵了,因為它也不知你到底是要使用哪一個。」
  老爹補充道。
  「那上面最後一種情況計算機難道不會疑惑麽?它怎麽知道到底使用哪個a呢?」
鍵盤左右鍵 ← → 可以切換章節
章節問題回報:
翻譯有問題
章節內容不符
章節內容空白
章節內容殘缺
上下章節連動錯誤
小說很久沒更新了
章節顯示『本章節內容更新中』
其他訊息