溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

【C++探索之旅】第一部分第四課:內存,變量和引用

發布時間:2020-06-19 17:33:11 來源:網絡 閱讀:495 作者:frogoscar 欄目:移動開發

【C++探索之旅】第一部分第四課:內存,變量和引用


內容簡介

1、第一部分第四課:內存,變量和引用

2、第一部分第五課預告:簡易計算器



內存,變量和引用


上一課《【C++探索之旅】第一部分第三課:第一個C++程序》中,我們已經學習了如何創建,編譯,運行我們的第一個C++程序。我們也解釋了這個程序每一行的意義。


我們不但在IDE(Integrated Development Environment,集成開發環境。例如Visual Studio,Codeblocks,xCode等)中創建程序,也學習了如何在終端命令行中創建。


不過到目前為止,我們寫的程序還非常簡單,只能在屏幕上顯示消息,還不能和用戶進行交互。我們慢慢來彌補這一缺憾。


在此之前,我們首先來學習一個計算機科學的基本概念,就是:變量。


變量使用電腦的內存來存儲信息,以便之后再次使用。大家應該用過計算器吧,我們平時不太使用的幾個鍵:M+,M-,MR,MC,其實就是在使用變量和內存的概念(M是Memory的縮寫,表示《內存》),這幾個鍵的作用如下:


M+:把目前顯示的值放在存儲器中 (memory +)

M- :從存儲器內容中減去當前顯示值 (memory -)

MR:調用存儲器內容 (memory recall)

MC:清除存儲器內容 (memory clear)


以上這些按鍵,可以操作存儲在計算器的存儲器(內存)里的計算值。


我們將在電腦上學習類似的事情,畢竟我們的電腦兄說到底不過是一臺大“計算器”,本質上就是做二進制(0和1)的運算,不然也不會叫“計算機”了對吧。



什么是變量


上面我們舉了計算器的例子來更形象地說明,畢竟在信息技術的世界里,基本的原理是相通的。在我們的電腦里,也有一些電子元件,可以儲存數值,并且能保存一段時間。當然,背后的科學原理是比較復雜的。


不過大家可以放心,我們沒必要搞清楚這背后的一套復雜的原理,我們只需要學會怎么把數值存儲到電腦的內存中就好了。至于復雜的部分就交由編譯器和操作系統來處理了,是不是突然覺得生活很美好呢?


我們只需要知道變量其實就是電腦借給我們的一小段內存,里面儲存了數值。我們可以想象電腦里面有一個大櫥柜(比喻內存),如下圖所示。這個大櫥柜非比尋常,因為它擁有成千上萬(甚至數十億)個小抽屜,這些小抽屜就是內存中我們可以存放數值的地方。


【C++探索之旅】第一部分第四課:內存,變量和引用


電腦的內存的原理就有點像一個有著很多抽屜的大櫥柜。


對于一個計算器來說,我么通常一次只能儲存一個數值。但是我們的電腦可比普通的計算器厲害多了。不然也不會那么貴了,對吧?說的就是你,蘋果電腦。


聰明如你應該料想到了:在C++程序中,我們可以同時儲存很多變量。因此,就需要區分這些變量,以便之后調用時可以分得清誰是誰。因此,在C++程序中,每個變量擁有一個名字。這個名字就有點像上圖中的抽屜外面貼的標簽,使我們能夠找到所要的抽屜。


我們的電腦還可以使我們儲存不同的數值,比如我們想儲存數字,字母,單詞,句子,圖片,聲音,等等。這就涉及到變量的類型了。


你可以想象變量的類型就好比抽屜的不同樣式,在生活中,我們放葡萄酒和書籍的抽屜是不一樣的,不是嗎?


變量名


對于人來說,名字很重要,名字起得好,有很多益處。名字起得不好,會很搞笑。


【C++探索之旅】第一部分第四課:內存,變量和引用


變量也有名字,而給C++中的變量起名字有如下規則:


  1. 只能包含字母,數字和下劃線(_)

  2. 第一個字符必須是字母或下劃線

  3. 不能和C++的關鍵字重復,比如不能是int,char,if,while等。


例如:


name,studentNum,year2015,_computerPrice 等都是規范的命名。


而:


+animal,@gmail,*1991,等都是通不過的命名。


除此之外,C++對于大小寫敏感。也就是說,大寫字母和小寫字母在C++看來是不同的。有的編程語言不區分大小寫。所以,在C++中,givenName,GIVENname,GiVenName是不同的變量名。


另外,希望大家養成良好的命名習慣,使自己的變量做到見名知意,這樣程序就可以自注釋了。比如,我們提倡這樣的變量名:myName,computerPrice。而不推薦類似 name1,variable3,hehe2,之類不知所云的名字。


對于程序的編譯器來說,這樣并沒有什么用,因為它才不管你名字起得是不是見名知意。但是,對于你自己和以后要閱讀你的程序人來說,一個好的變量名會發揮很大的作用,不然過了一段時間再看自己的代碼,可能都忘了這個變量是用來干嘛的。


小編自己有個變量命名習慣,此習慣不少程序員也遵守:


  1. 變量名由小寫字母開頭

  2. 如果變量名由幾個單詞組成,那么緊挨著寫

  3. 除了第一個單詞,其他單詞的第一個字母大寫


例如:


bestRestaurantName,secondBugReport,等等。


這樣的命名法也稱為《小駝峰式命名法(lower camel case)》。


變量類型


之前說了,變量除了有名字,還有類型。就好比“小明”這個名字,不知道是人呢還是一只寵物。


C++的變量類型如下圖所示:


【C++探索之旅】第一部分第四課:內存,變量和引用


有點多是嗎?初學時不用一下子都記住,我們慢慢來學習。一開始只要知道幾種常用的變量類型就可以了。如下:


常用類型

可以存儲的數值

bool

true(真)或false(假)

char

一個字符

int

整數

unsigned int

無符號整數(正整數或0)

double

帶小數點的數(其實double是雙精度浮點數)

string

字符串(0到多個字符)


一般,我們在IDE中輸入以上這些變量類型時,IDE會用顏色來高亮顯示。


這些類型可儲存的數值有大小范圍,也就是上下限。比如有的很大的整數,int類型就不能儲存。這些上下限取決于你的電腦,操作系統和編譯器。


當我們使用變量時,就需要考慮用哪種變量類型了。例如你要儲存一個學校的學生數目,那么int和unsigned int會適合。要儲存一個人的身高,那么用double會適合。要儲存你自己的名字,那么string會適合。


那么bool這種變量類型是什么意思呢?


bool其實是boolean(布爾類型)的意思,它只能儲存兩種值:true(真)或false(假)。


我們可以用bool類型的變量來儲存例如: 用戶名是否正確,是不是程序員,有沒有女朋友,之類。



變量聲明


變量的英語是variable,是《可變的,變化不定的》,所以說,變量和女人的心有點像,不是嗎?開個小玩笑。


因此,變量儲存的數值是可以改變的。


好了,鋪墊也夠多了,該來正式請求電腦出借它的“抽屜”了(前面我們用抽屜比喻一塊內存空間)。用術語來說,就是變量聲明。


注意:我們暫時用《聲明》這個詞,其實要澄清一下:

==========================

對 變量而言,聲明與定義的關系稍微復雜一些。在聲明部分出現的變量有兩種情況:一種是需要在內存中建立存儲空間的(如int a;);另一種是不需要建立存儲空間的(如extern int a;  以后會講到extern關鍵字)。前者稱為定義型聲明(defining declaration),或簡稱為定義(definition)。后者稱為引用型聲明(referenceing declaration)。


廣 義地說,聲明包括定義,但并非所有的聲明都是定義。對 int a; 而言,它是定義性聲明,既可說是聲明,又可說是定義。而對 extern int a; 而言,它是聲明而不是定義。一般為了敘述方便,把建立存儲空間的聲明稱為定義,而把不需要建立存儲空間的聲明稱為聲明。


在這一課中所有用到《聲明》的地方,其實用的是《定義型聲明》。以后的課會講解《引用型聲明》。

==========================


我們需要向電腦提供變量的類型,名字和它儲存的值。這里的值會成為變量的初始值。


為了做到這一點,我們只需按照以下格式:


類型  名字  ();


以上的格式是C++中初始化一個變量的方式。


我們也可以用另一種從C語言繼承過來的格式:


類型  名字  = ;


這兩種格式的效果是一樣的。我們推薦使用第一種格式,以后的課程中會講述為什么選第一種格式更好。


可不要忘了句末的分號(;),這個錯誤即使是有經驗的程序員也會犯。當然這個錯誤也不難發現,只不過它會讓你的編譯器不安分而已。


我們就來聲明(定義型聲明)一個變量,這個變量叫做userAge,用于儲存《用戶年齡》:


#include <iostream>

using namespace std;

int main()
{
    int userAge(16);
    
    return 0;
}


上面程序的第6行發生了什么呢?

答:電腦得知我們要向它的內存借一個“抽屜”,這個抽屜有以下特性:


  1. 可以儲存整數

  2. 抽屜外面貼了一個標簽,名叫 userAge

  3. 抽屜里儲存的值是16


因此,一旦程序運行完了第6行代碼,你就成為電腦內存中那個抽屜的主人了,如下圖:


【C++探索之旅】第一部分第四課:內存,變量和引用


因為之后我們會繼續向電腦借很多“抽屜”,所以我們需要把圖畫得簡單些。如下:


【C++探索之旅】第一部分第四課:內存,變量和引用
我們來解釋一下上圖的意思:


  1. 大大的藍色矩形代表的是電腦的內存,目前,內存幾乎是空的。

  2. ***的小正方形代表電腦出借給我們的內存的一塊空間。也就是我們之前比喻的一個抽屜。它里面儲存的值是16,而它的標簽是userAge。


既然我們畫了如此好(chou)看(lou)的圖,那豈能只聲明一個變量。一不做二不休:


#include <iostream>

using namespace std;

int main()
{    
    int userAge(16);
    int money(432);  //錢數    
    double pi(3.14159);    
    bool isHoliday(true); //是不是假期    
    char letter('a');  
     
    return 0;
}


上面的程序中,我們在userAge這個變量之外,又聲明了好幾個新的變量。


有兩點需要注意:


  1. bool類型的變量只能儲存true或false中的一個值,不是true(真),就是false(假),除此之外不能儲存其他值。

  2. char變量的值需要用單引號括起來,不要寫成 char letter(c); 而是 char letter('c');


插一句題外話:寫程序時要勤寫注釋,哪怕看似比較簡單的地方,因為以后別人看你的程序,或者你自己回看自己的程序,假如沒有注釋,那可能會增加不少難度。


對于上面這個程序,我們也可以畫一個圖,只要在之前的圖上增加新的變量即可。


【C++探索之旅】第一部分第四課:內存,變量和引用


可以看到,我們多聲明了幾個變量,內存里面開始變得豐富多彩起來了。馬上要圣誕了,人多一些總是熱鬧。


上面的程序,我們如果編譯,運行,可以看到它什么也沒有輸出。那是當然的,因為我們只是聲明了一些變量,還沒使用它們呢。


我希望你沒有太失望,雖然這個程序沒有顯示什么,但其實在背后電腦是進行了很多操作的。只不過這些操作對用戶隱藏起來了,我們也不太感興趣而已。不過我們還是總結一下上面的變量聲明究竟做了什么:


  1. 你的程序向操作系統(簡稱OS,是Operating System的縮寫。例如Windows,Mac OS X,Linux等都是常見的操作系統)借一些內存來使用

  2. 操作系統查看內存是否有空余的空間,如果有則分配幾個“抽屜”(代表內存空間)給你的程序

  3. 你的程序逐一將那些值存放進對應的抽屜。例如在貼有userAge標簽的抽屜里,存放進16;在貼有money標簽的抽屜里存放進432;等等

  4. 運行到最后一行(return 0;)時,你的程序把所有抽屜清空,并且還給操作系統


字符串的情況


前面說了,字符串這種變量類型的情況有點特殊。為了使用字符串變量,我們首先需要在程序中多加一行:


#include <string>


表示引入string這個C++的標準庫,這樣我們才能使用其中的函數等。我們可以寫個程序:


#include <iostream>
#include <string>

using namespace std;

int main()
{
    string userName("Steve Jobs");
    
    return 0;
}


可以看到,我們聲明了一個字符串變量,它的名字是userName,里面存放的值是Steve Jobs(蘋果的前CEO)。


可以看到,給string型變量賦值,用的是雙引號",而之前給char型變量賦值時用的是單引號'。其實呢,字符串(string)就是由一串字符(char)組成的。


偷懶的小技巧


在繼續下面的內容之前,我們介紹一種“偷懶”的小技巧,很多程序員都會用:


如果你有多個同一類型的變量要聲明,那么可以將它們放在同一行里,彼此用逗號隔開。如下:


int a(2), b(4), c(6); //我們聲明了三個整型變量a, b, c,分別存放了2, 4, 6三個值
string userNameApple("Steve Jobs"), userNameMicrosoft("Bill Gates");  
//我們聲明了兩個字符串變量userNameApple和userNameMicrosoft,分別存放Steve 
Jobs(史蒂夫喬布斯)和Bill Gates(比爾蓋茨)。


這樣我們就不用每次都寫一遍變量類型名了,上例中是int和string。



聲明但不初始化


上面我們學習了如何聲明一個變量(其實是定義型聲明),其實聲明一個變量時你的程序陸續做了兩件事:


  1. 首先,程序向操作系統請求撥給一塊內存空間,稱為“變量分配”。

  2. 然后,在這塊內存空間上存入初始值,稱為“變量初始化”。


但是,有的時候我們在聲明變量時還沒有想好要賦什么值。所以,我們也可以聲明變量,但不初始化。


怎么做呢?很簡單,只需要寫變量類型和變量名,就可以了。如下:


類型  名字;


是不是很簡單呢?我們來看例子程序:


#include <iostream>
#include <string>

using namespace std;

int main()
{     
    string qqName;  // QQ用戶名
    string qqNumber; // QQ號
    bool isVIP;     // 是不是QQ的VIP會員
    
    return 0;
}


注意:有一個常見的錯誤是:

在變量名之后加空的括號,例如 string qqNumber();

這是不正確的,不要加括號,只需要類型和名字。


我們也用圖解來演示上面的程序:



【C++探索之旅】第一部分第四課:內存,變量和引用


可以看到,在聲明變量后,變量中的值是一個任意值。


但是通常我們最好在聲明時給變量賦初值,特別是指針的情況,以后我們會學習。而且有的變量類型還必須在聲明時就初始化。



顯示變量的值


在上一課中,我們已經學習了如何在屏幕上顯示文本,希望你沒有忘記大明湖畔的夏雨荷。


是的,這位"夏雨荷"就是 cout<<


cout有點類似C語言的printf函數,是C++里面負責標準輸出的。不過又有不同,我們可以看到cout后面不是加括號,而是連接了<<這個特殊的符號。


暫時我們不深入,因為cout其實不是一個函數,cout是一個ostream類的對象(關于類和對象,之后的課程會講解),它有一個成員運算符函數 operator<<(涉及到C++的運算符重載的技術,以后會講)。(這一句指令暫時不需要理解,只要知道cout<<可以用來向屏幕輸出內容即可)。


那么機智如你,應該猜到怎么顯示變量的值了吧。


【C++探索之旅】第一部分第四課:內存,變量和引用


是的,就是把文本替換成變量名就行了。如下:


cout << userAge;


這么簡單,你敢信?


是的,就是這么簡單。


#include <iostream>

using namespace std;

int main()
{
    int userAge(16);
    cout << "你的年齡是 : ";
    cout << userAge;
    
    return 0;
}


運行以上程序,顯示:


你的年齡是 : 16


當然了,我們也可以同時顯示好幾個變量的值,并且把一句話的內容都寫在一行上。如下:


#include <iostream>
#include <string>

using namespace std;

int main()
{
    int userIQ(150);
    string userName("Albert Einstein");  // 阿爾伯特.愛因斯坦
    
    cout << "你名叫 " << userName<< ", 你的智商是 " << userIQ<< endl;
    
    return 0;
}


運行以上程序,顯示:


你名叫 Albert Einstein, 你的智商是 150



引用


在結束這一課之前,我們還有一個很重要的知識點需要介紹。


這個知識點就是:引用


《引用》的英語是reference。


我們之前說過,變量可以被看成內存里的一個“抽屜”。這個抽屜外面可以貼標簽,就是變量名。


實際生活中,我們可以在同一個抽屜外面貼上不止一個標簽。那么,在C++中,我們也可以給同一個內存的“抽屜”上貼好多個標簽。


因此,我們就多了一種訪問變量的方式。就好像我們給變量取一個別名。但是別名聽起來沒有那么高大上,所以C++中稱之為“引用”。聽著是不是挺玄乎的,其實就是別名。


我們可以用下圖來演示:


【C++探索之旅】第一部分第四課:內存,變量和引用


可以看到,在內存中的這個變量上,有兩個標簽。一個是userAge,聲明此變量時起的變量名;另一個是myVariable,是它的別名,也就是引用。


比如,黃曉明,也可以叫小明,兩個名字指代的都是那個人,都愛著Angelababy。


那么引用怎么聲明呢?要用到一個特殊的符號:&


int userAge(16);  // 聲明一個變量,名字是userAge

int& myVariable(userAge); // 聲明一個引用變量,名叫myVariable,它是userAge變量的別名。


可以看到,userAge放在了myVariable后面的括號里,還記得變量如何初始化嗎?就是在括號里填入初始值。因此,這里相當于把userAge“賦值”給了myVariable


說到底,userAge和myVariable指向的是同一個“抽屜”,同一個變量。它們的值都是16。


用術語說就是:myVariable引用了userAge。


引用變量的類型必須和它要引用的變量一樣。而且,引用變量聲明時必須賦初值。


我們來看一個例子程序:


#include <iostream>

using namespace std;

int main()
{    

    int userAge(16); // 一個變量,名字是userAge,包含一個整型數值16        
    int& myReference(userAge); // 變量userAge的一個引用    

    // 從現在開始,我們可以不加區分地使用userAge或myReference    
    // 因為它們實際上是一個內存中“抽屜”的兩個標簽,指向的是相同內容    

    cout << "你已經 " << userAge << "  歲了. (通過 變量名)" << endl;    
    // 慣常的方式    
    
    cout << "你已經 " << myReference << " 歲了. (通過 引用)" << endl;    
    // 用引用的方式來訪問變量值        

    return 0;
}


運行以上程序,顯示:


你已經 16 歲了. (通過 變量名)

你已經 16 歲了. (通過 引用)


那么,引用到底有什么用呢?


好問題。在上面的例子中,仿佛看不出引用有多大用處。


也許暫時你覺得引用比較抽象,也貌似沒什么用。但是要知道,引用是C++中很重要的一塊知識點,而且以后我們會“大寶啊,天天見”,會經常使用到“引用”的。而且還會區分什么時候用引用,什么時候用指針。


因此,先對引用的概念有個了解,對我們之后處理更復雜的用例是大有裨益的。



總結


  1. 變量是存儲在內存里的一段信息

  2. 根據存儲的信息的不同,變量有不同類型:int,char,bool,double,等

  3. 變量在使用前需要先聲明,例如:int number(28); // 此處是定義型聲明

  4. 可以用cout來顯示變量的值

  5. 引用其實是變量的別名,有點像標簽,使我們可以用另一個名字來調用變量,例如:int& numberReference(number);



第一部分第五課預告


今天的課就到這里,一起加油吧!

下一課我們學習:簡易計算器

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女