如何掌握C++指針基礎(chǔ)
C++指針就像是其它變量一樣,所不同的是一般的變量包含的是實際的真實的數(shù)據(jù),而指針是一個指示器,這些都是一些C++指針基礎(chǔ)性的問題,也是C++中指針中的一個非常重要的概念。
它告訴程序在內(nèi)存的哪塊區(qū)域可以找到數(shù)據(jù)。這是一個非常重要的概念,有很多程序和算法都是圍繞指針而設(shè)計的,如鏈表。如何定義一個指針呢?就像你定義一個其它變量一樣,只不過你要在指針名字前加上一個星號。
我們來看一個例子:下面這個程序定義了兩個指針,它們都是指向整型數(shù)據(jù)。你注意到在兩個變量名前的“p”前綴了嗎?這是程序員通常在定義C++指針基礎(chǔ)時的一個習(xí)慣,以提高便程序的閱讀性,表示這是個指針。現(xiàn)在讓我們來初始化這兩個指針:
- #include <iostream.h>
- void main()
- {
- // 聲明變量:
- int nNumber;
- int *pPointer;
- // 現(xiàn)在給它們賦值:
- nNumber = 15;
- pPointer = &nNumber;
- //打印出變量nNumber的值:
- cout<<"nNumber is equal to :"<< nNumber<<endl;
- // 現(xiàn)在通過指針改變nNumber的值:
- *pPointer = 25;
- //證明nNumber已經(jīng)被上面的程序改變
- //重新打印出nNumber的值:
- cout<<"nNumber is equal to :"<<nNumber<<endl;
- }
號讀作“什么的地址”,它表示返回的是變量在內(nèi)存中的地址而不是變量本身的值。在這個例子中,pNumberOne 等于some_number的地址,所以現(xiàn)在pNumberOne指向some_number. 如果現(xiàn)在我們在程序中要用到some_number,我們就可以使用pNumberOne.
我們來學(xué)習(xí)一個例子:在這個例子中你將學(xué)到很多,如果你對C++指針基礎(chǔ)的概念一點都不了解,我建議你多看幾遍這個例子,指針是個很復(fù)雜的東西,但你會很快掌握它的。這個例子用以增強你對上面所介紹內(nèi)容的了解。它是用C編寫的(注:原英文版是用C寫的代碼,譯者重新用C++改寫寫了所有代碼,并在DEV C++ 和VC++中編譯通過!)
- #include <iostream.h>
- void main()
- {
- // 聲明變量:
- int nNumber;
- int *pPointer;
- // 現(xiàn)在給它們賦值:
- nNumber = 15;
- pPointer = &nNumber;
- //打印出變量nNumber的值:
- cout<<"nNumber is equal to :"<< nNumber<<endl;
- // 現(xiàn)在通過指針改變nNumber的值:
- *pPointer = 25;
- //證明nNumber已經(jīng)被上面的程序改變
- //重新打印出nNumber的值:
- cout<<"nNumber is equal to :"<<nNumber<<endl;
- }
通讀一下這個程序,編譯并運行它,務(wù)必明白它是怎樣工作的。如果你完成了,準(zhǔn)備好,開始下一小節(jié),這段程序先調(diào)用了SomeFunction函數(shù),創(chuàng)建了個叫nNumber的變量。接著讓C++指針基礎(chǔ)pPointer指向了它??墒菃栴}出在哪兒呢?當(dāng)函數(shù)結(jié)束后,nNumber被刪掉了,因為這一個局部變量。局部變量在定義它的函數(shù)執(zhí)行完后都會被系統(tǒng)自動刪掉。
也就是說當(dāng)SomeFunction 函數(shù)返回主函數(shù)main()時,這個變量已經(jīng)被刪掉,但pPointer還指著變量曾經(jīng)用過的但現(xiàn)在已不屬于這個程序的區(qū)域。如果你還不明白,你可以再讀讀這個程序。
注意它的局部變量和全局變量,這些概念都非常重要。但這個問題怎么解決呢?答案是動態(tài)分配技術(shù)。注意這在C和C++中是不同的。由于大多數(shù)程序員都是用C++,所以我用到的是C++中常用的稱謂。
【編輯推薦】