上一講雞啄米介紹了指針的基本概念和地址運算,今天為大家帶來指針賦值和指針運算的內容。

       一.指針的賦值

       當我們聲明了一個指針之后,這個指針變量中沒有存儲任何確定的地址值,而是一個隨機整數。也就是它指向的地址是不確定的,有可能它指向了系統的重要數據,這時候我們如果修改了它指向地址的值可能會引起想象不到的系統問題。所以指針聲明以后要先賦值才可以引用。

       跟雞啄米前面講的其他類型的變量一樣,給指針變量賦值也有兩種方式:

       1.在聲明指針時對其進行初始化,也就是賦一個初值,初始化形式為:數據類型 *指針名=初始地址值;。

       2.在聲明指針后,單獨給它賦值,賦值的語法形式為:指針名=地址;。

       如果我們像方式1中使用變量地址為指針初始化,或者像方式2中將變量地址賦給指針,此變量必須在此之前聲明過,并且這個變量的類型要和指針類型一樣。可以將一個已經賦值的指針賦值給另一個指針,讓多個指針指向相同的變量。

       雞啄米給大家一個用兩種方式為指針賦值的例子:

       int a[5];         // 聲明一個整型數組
       int *p1=a;     // 聲明指針p1,并用數組首地址a來初始化p1
       int *p2;         // 聲明指針p2
       p2=a;           // 將數組首地址a賦值給指針p2

       雞啄米說過,數組名就是數組的首地址,所以它可以用來給指針賦值。

       另外,雞啄米要強調的是,賦給指針變量的值必須是地址常量(比如數組名)或地址變量,但一定不能是非0整數。給指針賦值為0時表示該指針是一個空指針,它不指向任何地址,比如,int *p=0;。為什么會把指針聲明為空指針呢?大家想想,我們在聲明一個指針時沒有給它賦值,這時它是一個隨機的值,在給它賦確定的地址值之前如果我們使用了它,就可能會訪問到重要的內存地址并破壞此地址的數據,造成嚴重后果,所以我們在軟件開發中一般先將指針設為空指針。

雞啄米:C++編程入門系列之二十八(數組、指針和字符串:指針的賦值和指針運算)

       給大家一個指針的聲明、賦值和使用的例子:

       #include<iostream>
       using namespace std;
       int main()
       {
                int *p; //聲明int型指針p
                int i; //聲明int型數i
                p=&i; //取i的地址賦給p
                i=6; //int型數賦初值
                cout<<"Output int i="<<i<<endl;//輸出int型數的值
                cout<<"Output int pointer i="<<*p<<endl;//輸出int型指針所指地址的內容
                return 0;
       }

      程序運行結果是:

      Output int i=6
      Output int pointer i=6

      上面的程序首先聲明了int型指針p,又聲明了int型變量i,然后取i的地址賦給指針p,再給i賦值6,因為i等于6,所以第一個cout語句輸出Output int i=6。*p表示p指向的變量的值,因為p存儲的是i的地址,所以p指向i,*p的值也是6,第二個cout語句輸出Output int pointer i=6。

       雞啄米再給大家強調幾點:

       1.我們可以聲明指向常量的指針,這時候指針本身的值可以改變,也就是指針可以指向其他對象,但是我們不能通過指針改變它指向的值。例如:

       const char *name="Tom"; //指向常量的指針
       char s[]="Lili";
       name=s;                               //正確,name本身的值可以改變
       *name=’a’;                           //編譯時指出錯誤,不能通過name修改指向的對象

       2.我們還可以聲明指針常量,這時候指針本身的值不能改變,例如:

       int a=1;
       int b=2;
       int *const p=&a;    // 聲明指針常量p
       p=&b;               // 錯誤,不能改變指針常量p的值

       3.我們進行指針賦值時可以將某個指針的值賦給相同類型的另一個指針。但是有一種特殊類型的指針,可以用任意類型對象的地址為之賦值,這就是void類型指針。我們在使用void類型的指針訪問數據時需要進行強制類型轉換。雞啄米給大家一個void指針的例子:

        void *p;
        int *p1;
        int a;
        void main()
        {
                  p=&a;         // void類型的指針p指向整型變量a
                  p1=(int*)p;   // 用強制類型轉換的方式將void指針p的指針賦給int型指針p1
        }

       二.指針運算

       雞啄米前面說過,指針也是一種數據類型,也可以參與一些運算。指針能夠進行的運算有賦值運算、算術運算和關系運算。賦值運算雞啄米上面剛講過了。下面介紹算術運算和關系運算。

       指針可以和整數進行加減運算,但是跟一般的加減運算不同,指針的加減運算跟指針的類型密切相關,例如,char型指針p和整數3,p+3表示p所指地址后面第3個字符的地址,p-3就表示p所指地址前面第3個字符的地址。給大家一個更直接的例子,有整型數組int a[5],p指向數組首地址a,則a+3表示首地址后第3個整數的地址,即a[3]。

       “指針++”和“指針--”表示指針所指地址的下一個或前一個數據的地址。

       指針的算術運算一般都是在操作數組的時候進行,因為只有聲明數組才可以得到連續的內存空間。如果我們對一個單獨的變量地址進行加或減的算術運算,然后改變新地址的值,則可能會破壞該地址的數據,所以在對指針進行算術運算時要明確運算的結果是程序中分配可用的地址。

       指針的關系運算說的是相同類型的指針之間的關系運算。不同類型的指針之間的關系運算沒有任何意義,指針和非0整數的關系運算也沒有任何意義,但是指針可以和0進行關系運算,后面雞啄米會講。兩個相同類型的指針相等,表示這兩個指針指向同一個地址。

       今天講的仍然是很重要的內容,雞啄米希望大家掌握好,關鍵是理解,這些以后在軟件開發中會經常用到。有什么問題可以在雞啄米博客留言討論。
 

除非特別注明,雞啄米文章均為原創
轉載請標明本文地址:http://www.vkzldl.live/software/78.html
2011年10月31日
作者:雞啄米 分類:軟件開發 瀏覽: 評論:4