學習C++ -> 指針初步


學習C++ -> 指針初步



一、指針
    1. 什么是指針?
        我們知道, 計算機的內存是由一個個獨立的存儲單元組成, 並且系統會對每一個存儲單元分配一個唯一的號碼, 稱為這個存儲單元的"地址"。分配號碼給一個存儲單元的目的是為了便於找到它, 從而進行進一步的操作, 比如是讀取還是寫入。
        
        在C++中, 如果要對某個存儲單元進行訪問(讀取/寫入), 有兩種方式, 一是通過變量名找到存儲地址再進行訪問, 二是直接通過存儲地址進行訪問。
            1>. 通過變量名進行訪問
                通過變量名進行訪問就是我們通過編譯器起一個名字, 程序在運行時, 系統為該程序建立一個變量名與內存單元地址之間的映射表, 通過名字即可找到該存儲單元的地址並進行操作。例如:
                    char name ;        int value = 10 ;    float price ;
                等這些都屬於通過變量名對內存單元中的值進行操作。
                
            2>. 通過地址直接訪問
                顯然, 通過地址直接進行訪問要比經過一次 "中轉" 速度更快, 既然要通過地址進行直接訪問那么就必須要知道這個地址的值(編號)是多少, 並且要把這個地址值(編號)給保存起來, 這樣才能方便后來隨時直接訪問這個地址。
                
                在這種方式中, "地址" 給他起了個新的名字, 叫指針, 而保存指針的變量稱為指針變量。
                
                
    2. 認識指針
        同一般的變量, 每種變量都有自己的數據類型, 如 int a ; 說明這個變量是保存一個整數的。 指針亦是如此, 定義一個指針變量:
            int *pa ;
        int *pa ; 則表示變量pa是一個指針變量, pa應當保存類型為int的變量在內存中的地址。
        同理, 我們還可以定義其他類型的指針變量:

            char   *pa ;
            int    *pb ;
            float  *pc ;
            double *pd ;

            ...
        定義時, 其*號的位置可以靠左( int* pa; ), 居中( int * pa; )或靠右( int *pa; ), 具體使用哪種形式可根據個人習慣。
        一個語句中也可以同時定義多個指針變量, 方法為:

            int *pa, *pb, *pc ;

 
            
    3. 指針的初始化與賦值
        我們已經知道, 指針變量中所保存的內容為內存的地址, 要對指針變量進行初始化首先應該取到被指向的變量在內存中的地址。在C++中, 用 '&' 符號來獲取變量的地址, 如:

        #include <iostream>

        int main()
        {
            int a = 10 ;
            std::cout<< &a ;    //輸出變量a在內存中的地址

            return 0 ;
        }

 
        輸出窗口顯示:

        0x23ff4c
        Process returned 0 (0x0)   execution time : 0.031 s
        Press any key to continue.

 
        這個 0x23ff4c 就是以16進制輸出的當前a變量在內存中的地址, 這個值與當前計算機內存的狀態有關, 所以不同計算機輸出的可能不同。
        
        指針可以在定義時對其進行初始化, 如:

            int a = 10 ;
            int *pa = &a ;


        也可以對指針變量進行賦值操作:

            int *pb ;
            int b = 10 ;
            pb = &b ;        //將b的地址賦值給指針變量pb

 
            
            
    4. 指針的初步使用
        知道了如何對指針類型進行定義、初始化以及如何賦值后就可以初步的去運用指針了, 首先看一個運用示例:

        #include <iostream>

        int main()
        {
            int a = 10 ;
            int *pa = &a ;      //定義指針變量pa並初始化地址為變量a在內存中所在的地址

            std::cout<< a << "\n" ;      //通過變量名訪問a變量所在的地址
            std::cout<< *pa << "\n" ;    //運用*號訪問指針變量pa中所保存的地址

            return 0 ;
        }


        輸出:

        10
        10

        Process returned 0 (0x0)   execution time : 0.016 s
        Press any key to continue.

 
        可以看到, std::cout<< a << "\n" ;std::cout<< *pa << "\n" ; 輸出的是相同的結果, 都是10。這是因為 a 與 *pa 實際上都是指向同一個存儲地址, *號為間接訪問符, 表示要訪問指針變量中所存放的內存地址。
        
        再看一個示例, 運用指針改變變量的值:

        #include <iostream>

        int main()
        {
            int b = 10 ;
            int *pb = &b ;

            std::cout<<"改變前b變量中的值:"<<b<<"\n" ;
            *pb = 20 ;      //運用指針改變變量a所在的存儲單元中的內容
            std::cout<<"改變后b變量中的值:"<<b<<"\n" ;

            return 0 ;
        }


        這里運用 *pb = 20 ; 來改變變量b的值, 其功能與 b = 20 ; 的作用相同, 實際他們所改變的都是同一段內存單元中的值。只要能夠理解這點, 在掌握指針上會有很大的幫助。
        
        
    5. 指針運用時需要注意的一些問題
        1>. 左右兩邊類型要一致
            什么類型的指針變量存放什么類型的地址。
            
        2>. 避免"野"指針
            所謂的野指針即為沒有被正確初始化或賦值的指針, 他會隨機指向內存中的某個存儲單元, 如果不慎通過這個指針對其內存中的值進行其他操作的話后果是不可預知的。 總之, 要保證指針指向的正確性, 在不用時要及時對其賦值為 NULL, 即將其指向的地址設為NULL, 也就是空指針。

            

這里所學習的內容為指針的一些最基礎的知識, 或許在這里並沒有體現出指針的如何強大, 但隨着學習的深入使用指針的優勢就會逐漸體現出來。


--------------------


wid, 2013.01.14


上一篇: 學習C++ -> 二維數組

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM