久久久国产精品秘人口麻豆|永久免费AV无语国产|人成电影免费中文字幕|久久AV嫩草影院2

    1. <dfn id="yitbn"><samp id="yitbn"><progress id="yitbn"></progress></samp></dfn>

          <div id="yitbn"></div>

          1. 首頁 考試吧論壇 Exam8視線 考試商城 網(wǎng)絡課程 模擬考試 考友錄 實用文檔 求職招聘 論文下載
            2011中考 | 2011高考 | 2012考研 | 考研培訓 | 在職研 | 自學考試 | 成人高考 | 法律碩士 | MBA考試
            MPA考試 | 中科院
            四六級 | 職稱英語 | 商務英語 | 公共英語 | 托福 | 雅思 | 專四專八 | 口譯筆譯 | 博思 | GRE GMAT
            新概念英語 | 成人英語三級 | 申碩英語 | 攻碩英語 | 職稱日語 | 日語學習 | 法語 | 德語 | 韓語
            計算機等級考試 | 軟件水平考試 | 職稱計算機 | 微軟認證 | 思科認證 | Oracle認證 | Linux認證
            華為認證 | Java認證
            公務員 | 報關員 | 銀行從業(yè)資格 | 證券從業(yè)資格 | 期貨從業(yè)資格 | 司法考試 | 法律顧問 | 導游資格
            報檢員 | 教師資格 | 社會工作者 | 外銷員 | 國際商務師 | 跟單員 | 單證員 | 物流師 | 價格鑒證師
            人力資源 | 管理咨詢師考試 | 秘書資格 | 心理咨詢師考試 | 出版專業(yè)資格 | 廣告師職業(yè)水平
            駕駛員 | 網(wǎng)絡編輯
            衛(wèi)生資格 | 執(zhí)業(yè)醫(yī)師 | 執(zhí)業(yè)藥師 | 執(zhí)業(yè)護士
            會計從業(yè)資格考試會計證) | 經(jīng)濟師 | 會計職稱 | 注冊會計師 | 審計師 | 注冊稅務師
            注冊資產(chǎn)評估師 | 高級會計師 | ACCA | 統(tǒng)計師 | 精算師 | 理財規(guī)劃師 | 國際內(nèi)審師
            一級建造師 | 二級建造師 | 造價工程師 | 造價員 | 咨詢工程師 | 監(jiān)理工程師 | 安全工程師
            質(zhì)量工程師 | 物業(yè)管理師 | 招標師 | 結(jié)構(gòu)工程師 | 建筑師 | 房地產(chǎn)估價師 | 土地估價師 | 巖土師
            設備監(jiān)理師 | 房地產(chǎn)經(jīng)紀人 | 投資項目管理師 | 土地登記代理人 | 環(huán)境影響評價師 | 環(huán)保工程師
            城市規(guī)劃師 | 公路監(jiān)理師 | 公路造價師 | 安全評價師 | 電氣工程師 | 注冊測繪師 | 注冊計量師
            繽紛校園 | 實用文檔 | 英語學習 | 作文大全 | 求職招聘 | 論文下載 | 訪談 | 游戲
            您現(xiàn)在的位置: 考試吧(eeeigo.com) > 計算機等級考試 > 計算機二級 > C加加 > 復習資料 > 正文

            全國計算機等級考試二級:C++指針基礎入門

            本文為“全國計算機等級考試二級:C++指針基礎入門”,以供廣大學員參考使用。更多關于計算機等級考試資料,請訪問考試吧計算機等級考試頻道。

              什么是指針?

              其實指針就像是其它變量一樣,所不同的是一般的變量包含的是實際的真實的數(shù)據(jù),而指針是一個指示器,它告訴程序在內(nèi)存的哪塊區(qū)域可以找到數(shù)據(jù)。這是一個非常重要的概念,有很多程序和算法都是圍繞指針而設計的,如鏈表。

              開始學習

              如何定義一個指針呢?就像你定義一個其它變量一樣,只不過你要在指針名字前加上一個星號。我們來看一個例子:下面這個程序定義了兩個指針,它們都是指向整型數(shù)據(jù)。

              int* pNumberOne;

              int* pNumberTwo;

              你注意到在兩個變量名前的“p”前綴了嗎?這是程序員通常在定義指針時的一個習慣,以提高便程序的閱讀性,表示這是個指針,F(xiàn)在讓我們來初始化這兩個指針:

              pNumberOne = &some_number;

              pNumberTwo = &some_other_number;

              &號讀作“什么的地址”,它表示返回的是變量在內(nèi)存中的地址而不是變量本身的值。在這個例子中,pNumberOne 等于some_number的地址,所以現(xiàn)在pNumberOne指向some_number. 如果現(xiàn)在我們在程序中要用到some_number,我們就可以使用pNumberOne.

              我們來學習一個例子:在這個例子中你將學到很多,如果你對指針的概念一點都不了解,我建議你多看幾遍這個例子,指針是個很復雜的東西,但你會很快掌握它的。

              這個例子用以增強你對上面所介紹內(nèi)容的了解。它是用C編寫的(注:原英文版是用C寫的代碼,譯者重新用C++改寫寫了所有代碼,并在DEV C++ 和VC++中編譯通過!)

              #include

              void main()

              {

              // 聲明變量:

              int nNumber;

              int *pPointer;

              // 現(xiàn)在給它們賦值:

              nNumber = 15;

              pPointer = &nNumber;

              //打印出變量nNumber的值:

              cout<<"nNumber is equal to :"<< nNumber<

              // 現(xiàn)在通過指針改變nNumber的值:

              *pPointer = 25;

              //證明nNumber已經(jīng)被上面的程序改變

              //重新打印出nNumber的值:

              cout<<"nNumber is equal to :"<

              }

              通讀一下這個程序,編譯并運行它,務必明白它是怎樣工作的。如果你完成了,準備好,開始下一小節(jié)。

            [NextPage]

              陷井!

              試一下,你能找出下面這段程序的錯誤嗎?

              #include

              int *pPointer;

              void SomeFunction();

              {

              int nNumber;

              nNumber = 25;

              //讓指針指向nNumber:

              pPointer = &nNumber;

              }

              void main()

              {

              SomeFunction(); //為pPointer賦值

              //為什么這里失敗了?為什么沒有得到25

              cout<<"Value of *pPointer: "<<*pPointer<

              }

              這段程序先調(diào)用了SomeFunction函數(shù),創(chuàng)建了個叫nNumber的變量,接著讓指針pPointer指向了它?墒菃栴}出在哪兒呢?當函數(shù)結(jié)束后,nNumber被刪掉了,因為這一個局部變量。局部變量在定義它的函數(shù)執(zhí)行完后都會被系統(tǒng)自動刪掉。也就是說當SomeFunction 函數(shù)返回主函數(shù)main()時,這個變量已經(jīng)被刪掉,但pPointer還指著變量曾經(jīng)用過的但現(xiàn)在已不屬于這個程序的區(qū)域。如果你還不明白,你可以再讀讀這個程序,注意它的局部變量和全局變量,這些概念都非常重要。

              但這個問題怎么解決呢?答案是動態(tài)分配技術。注意這在C和C++中是不同的。由于大多數(shù)程序員都是用C++,所以我用到的是C++中常用的稱謂。

              動態(tài)分配

              動態(tài)分配是指針的關鍵技術。它是用來在不必定義變量的情況下分配內(nèi)存和讓指針去指向它們。盡管這么說可能會讓你迷惑,其實它真的很簡單。下面的代碼就是一個為一個整型數(shù)據(jù)分配內(nèi)存的例子:

              int *pNumber;

              pNumber = new int;

              第一行聲明一個指針pNumber.第二行為一個整型數(shù)據(jù)分配一個內(nèi)存空間,并讓pNumber指向這個新內(nèi)存空間。下面是一個新例,這一次是用double雙精型:

              double *pDouble;

              pDouble = new double;

              這種格式是一個規(guī)則,這樣寫你是不會錯的。

              但動態(tài)分配又和前面的例子有什么不同呢?就是在函數(shù)返回或執(zhí)行完畢時,你分配的這塊內(nèi)存區(qū)域是不會被刪除的所以我們現(xiàn)在可以用動態(tài)分配重寫上面的程序:

              #include

              int *pPointer;

              void SomeFunction()

              {

              // 讓指針指向一個新的整型

              pPointer = new int;

              *pPointer = 25;

              }

              void main()

              {

              SomeFunction(); // 為pPointer賦值

              cout<<"Value of *pPointer: "<<*pPointer<

              }

              通讀這個程序,編譯并運行它,務必理解它是怎樣工作的。當SomeFunction 調(diào)用時,它分配了一個內(nèi)存,并讓pPointer指向它。這一次,當函數(shù)返回時,新的內(nèi)存區(qū)域被保留下來,所以pPointer始終指著有用的信息,這是因為了動態(tài)分配。但是你再仔細讀讀上面這個程序,雖然它得到了正確結(jié)果,可仍有一個嚴重的錯誤。

              分配了內(nèi)存,別忘了回收太復雜了,怎么會還有嚴重的錯誤!其實要改正并不難。問題是:你動態(tài)地分配了一個內(nèi)存空間,可它絕不會被自動刪除。也就是說,這塊內(nèi)存空間會一直存在,直到你告訴電腦你已經(jīng)使用完了。可結(jié)果是,你并沒有告訴電腦你已不再需要這塊內(nèi)存空間了,所以它會繼續(xù)占據(jù)著內(nèi)存空間造成浪費,甚至你的程序運行完畢,其它程序運行時它還存在。當這樣的問題積累到一定程度,最終將導致系統(tǒng)崩潰。所以這是很重要的,在你用完它以后,請釋放它的空間,如:delete pPointer;這樣就差不多了,你不得不小心。在這你終止了一個有效的指針(一個確實指向某個內(nèi)存的指針)。

            [NextPage]

              下面的程序,它不會浪費任何的內(nèi)存:

              #include

              int *pPointer;

              void SomeFunction()

              {

              // 讓指針指向一個新的整型

              pPointer = new int;

              *pPointer = 25;

              }

              void main()

              {

              SomeFunction(); //為pPointer賦值

              cout<<"Value of *pPointer: "<<*pPointer<

              delete pPointer;

              }

              只有一行與前一個程序不同,但就是這最后一行十分地重要。如果你不刪除它,你就會制造一起“內(nèi)存漏洞”,而讓內(nèi)存逐漸地泄漏。

              (譯者:假如在程序中調(diào)用了兩次SomeFunction,你又該如何修改這個程序呢?請讀者自己思考)

              傳遞指針到函數(shù)傳遞指針到函數(shù)是非常有用的,也很容易掌握。如果我們寫一個程序,讓一個數(shù)加上5,看一看這個程序完整嗎?:

              #include

              void AddFive(int Number)

              {

              Number = Number + 5;

              }

              void main()

              {

              int nMyNumber = 18;

              cout<<"My original number is "<

              AddFive(nMyNumber);

              cout<<"My new number is "<

              //得到了結(jié)果23嗎?問題出在哪兒?

              }

              問題出在函數(shù)AddFive里用到的Number是變量nMyNumber的一個副本而傳遞給函數(shù),而不是變量本身。因此,“Number = Number + 5”這一行是把變量的副本加了5,而原始的變量在主函數(shù)main()里依然沒變。試著運行這個程序,自己去體會一下。

            [NextPage]

              要解決這個問題,我們就要傳遞一個指針到函數(shù),所以我們要修改一下函數(shù)讓它能接受指針:把'void AddFive(int Number)' 改成 'void AddFive(int* Number)' 。下面就是改過的程序,注意函數(shù)調(diào)用時要用&號,以表示傳遞的是指針:

              #include

              void AddFive(int* Number)

              {

              *Number = *Number + 5;

              }

              void main()

              {

              int nMyNumber = 18;

              cout<<"My original number is "<

              AddFive(&nMyNumber);

              cout<<"My new number is "<

              }

              試著自己去運行它,注意在函數(shù)AddFive的參數(shù)Number前加*號的重要性:它告訴編譯器,我們是把指針所指的變量加5.而不并指針自己加5.最后,如果想讓函數(shù)返回指針的話,你可以這么寫:int * MyFunction();在這句里,MyFunction返回一個指向整型的指針。

              指向類的指針指針在類中的操作要格外小心,你可以用如下的辦法定義一個類:

              class MyClass

              {

              public:

              int m_Number;

              char m_Character;

              };

              接著你就可以定義一個MyClass 類的變量了:MyClass thing;

              你應該已經(jīng)知道怎樣去定義一個指針了吧:MyClass *thing;

              接著你可以分配個內(nèi)存空間給它:thing = new MyClass;

              注意,問題出現(xiàn)了。你打算怎樣使用這個指針呢,通常你可能會寫'thing.m_Number',但是thing是類嗎?不,它是一個指向類的指針,它本身并不包含一個叫m_Number的變量。所以我們必須用另一種方法:就是把'.'(點號)換成 -> ,來看下面的例子:

              class MyClass

              {

              public:

              int m_Number;

              char m_Character;

              };

              void main()

              {

              MyClass *pPointer;

              pPointer = new MyClass;

              pPointer->m_Number = 10;

              pPointer->m_Character = 's';

              delete pPointer;

              }

            [NextPage]

              指向數(shù)組的指針

              你也可以讓指針指向一個數(shù)組,按下面的方法操作:

              int *pArray;

              pArray = new int[6];

              程序會創(chuàng)建一個指針pArray,讓它指向一個有六個元素的數(shù)組。另外一種方法,不用動態(tài)分配:

              int *pArray;

              int MyArray[6];

              pArray = &MyArray[0];

              注意,&MyArray[0] 也可以簡寫成 MyArray ,都表示是數(shù)組的第一個元素地址。但如果寫成pArray = &MyArray可能就會出問題,結(jié)果是 pArray 指向的是指向數(shù)組的指針(在一維數(shù)組中盡管與&MyArray[0]相等),而不是你想要的,在多維數(shù)組中很容易出錯。

              在數(shù)組中使用指針

              一旦你定義了一個指向數(shù)組的指針,你該怎樣使用它呢?讓我們來看一個例子,一個指向整型數(shù)組的指針:

              #include

              void main()

              {

              int Array[3];

              Array[0] = 10;

              Array[1] = 20;

              Array[2] = 30;

              int *pArray;

              pArray = &Array[0];

              cout<<"pArray points to the value %d\n"<<*pArray<

              }

              如果讓指針指向數(shù)組元素中的下一個,可以用pArray++.也可以用你應該能想到的pArray + 1,都會讓指針指向數(shù)組的下一個元素。要注意的是你在移動指針時,程序并不檢查你是否已經(jīng)移動地超出了你定義的數(shù)組,也就是說你很可能通過上面的簡單指針加操作而訪問到數(shù)組以外的數(shù)據(jù),而結(jié)果就是,可能會使系統(tǒng)崩潰,所以請格外小心。

              當然有了pArray + 1,也可以有pArray - 1,這種操作在循環(huán)中很常用,特別是while循環(huán)中。

              另一個需要注意的是,如果你定義了一個指向整型數(shù)的指針:int* pNumberSet ,你可以把它當作是數(shù)組,如:pNumberSet[0] 和 *pNumberSet是相等的,pNumberSet[1]與*(pNumberSet + 1)也是相等的。

              在這一節(jié)的最后提一個警告:如果你用 new 動態(tài)地分配了一個數(shù)組,

              int *pArray;

              pArray = new int[6];

              別忘了回收,

              delete[] pArray;

              這一句是告訴編譯器是刪除整個數(shù)組而不一個單獨的元素。千萬記住了。

            [NextPage]

              后話

              這一句是告訴編譯器是刪除整個數(shù)組而不一個單獨的元素。千萬記住了。還有一點要小心,別刪除一個根本就沒分配內(nèi)存的指針,典型的是如果沒用new分配,就別用delete:

              void main()

              {

              int number;

              int *pNumber = number;

              delete pNumber; // 錯誤 - *pNumber 沒有用new動態(tài)分配內(nèi)存.

              }

              常見問題解答

              Q:為什么我在編譯程序時老是在 new 和 delete語句中出現(xiàn)'symbol undefined' 錯誤?

              A:new 和 delete都是C++在C上的擴展,這個錯誤是說編譯器認為你現(xiàn)在的程序是C而不C++,當然會出錯了?纯茨愕奈募遣皇。cpp結(jié)尾。

              Q:new 和 malloc有什么不同?

              A:new 是C++中的關健字,用來分配內(nèi)存的一個標準函數(shù)。如果沒有必要,請不要在C++中使用malloc.因為malloc是C中的語法,它不是為面向?qū)ο蟮腃++而設計的。

              Q:我可以同時使用free 和 delete嗎?

              A:你應該注意的是,它們各自所匹配的操作不同。free只用在用malloc分配的內(nèi)存操作中,而delete只用在用new分配的內(nèi)存操作中。

              引用(寫給某些有能力的讀者)

              這一節(jié)的內(nèi)容不是我的這篇文章的中心,只是供某些有能力的讀者參考。

              有些讀者經(jīng)常問我關于引用和指針的問題,這里我簡要地討論一下。

              在前面指針的學習中,我們知道(&)是讀作“什么的地址”,但在下面的程序中,它是讀作“什么的引用”

              int& Number = myOtherNumber;

              Number = 25;

              引用有點像是一個指向myOtherNumber的指針,不同的是它是自動刪除的。所以他比指針在某些場合更有用。與上面等價的代碼是:

              int* pNumber = &myOtherNumber;

              *pNumber = 25;

              指針與引用另一個不同是你不能修改你已經(jīng)定義好的引用,也就是說你不能改變它在聲明時所指的內(nèi)容。舉個例子:

              int myFirstNumber = 25;

              int mySecondNumber = 20;

              int &myReference = myFirstNumber;

              myReference = mySecondNumber;//這一步能使myReference 改變嗎?

              cout<

              當在類中操作時,引用的值必須在構(gòu)造函數(shù)中設定,例:

              CMyClass::CMyClass(int &variable) : m_MyReferenceInCMyClass(variable)

              {

              // constructor code here

              }

              總結(jié)

              這篇文章開始可能會較難掌握,所以最好是多讀幾遍。有些讀者暫時還不能理解,在這兒我再做一個簡要的總結(jié):指針是一個指向內(nèi)存區(qū)域的變量,定義時在變量名前加上星號(*)(如:int *number)。

              你可以得到任何一個變量的地址,只在變量名前加上&(如:pNumber = &my_number)。

              你可以用'new' 關鍵字動態(tài)分配內(nèi)存。指針的類型必須與它所指的變量類型一樣(如:int *number 就不能指向 MyClass)。

              你可以傳遞一個指針到函數(shù)。必須用'delete'刪除你動態(tài)分配的內(nèi)存。

              你可以用&array[0]而讓指針指向一個數(shù)組。

              你必須用delete[]而不是delete來刪除動態(tài)分配的數(shù)組。

              文章到這兒就差不多結(jié)束了,但這些并不就是指針所有的東西,像指向指針的指針等我還沒有介紹,因為這些東西對于一個初學指針的人來說還太復雜了,我不能讓讀者一開始就被太復雜的東西而嚇走了。好了,到這兒吧,試著運行我上面寫的小程序,也多自己寫寫程序,你肯定會進步不小的!

              相關推薦:計算機等級考試二級C++模擬試題15套(筆試)
                   計算機等級考試二級C++模擬試題15套(上機)
                   2010年全國計算機等級考試考試報考指南
            文章搜索
            版權聲明:如果計算機等級考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權益,請與我們聯(lián)系800@eeeigo.com,我們將會及時處理。如轉(zhuǎn)載本計算機等級考試網(wǎng)內(nèi)容,請注明出處。