C++Simplify06-指標

來源:互聯網
上載者:User

參考《C++ Primer第4版》(中文版)

1.      C++指標含義:指標儲存的是另一個對象的地址。參考型別

*解引用符(擷取所指的對象)&取地址

2.  每個指標都有一個與之關聯的資料類型,且該指標只能指向這一種類型的對象。

注意:string* ps1,ps2; 
實際上ps1定義為指標,ps2並非指標,只是一個普通的string對象而已。  string* ps1, *ps2;
這樣才是定義了兩個指標。

3.      指標取值為NULL相當於等於0.未初始化的指標式無效指標(存放一個不確定的地址),程式中避免使用無效指標。所以指標使用前盡量要初始化。

4.      void*指標:可以儲存任何類型對象的地址。

操作限制:與另一個指標進行比較;

                     
向函數傳遞void*指標或從函數返回void*指標;

                     
給另一個void*指標賦值。

不允許使用void*指標操作它所指的對象。

5.       區分給指標賦值和通過指標進行賦值

a)如果對做運算元進行解引用,則修改的是指標所指對象的值;

          
例如:string s1(“hello”);   string *sp1 = &s1;

                      string s2(“world”);        *sp1 = s2;

    此時指標sp1中所存的地址依舊s1的地址,但修改了s1的值此時s1=”wolrd”;

b)如果沒有使用解引用操作,則修改的是指標本身的值。

          
例如:string s1(“hello”);   string *sp1 = &s1;

                      string s2(“world”);        sp1 = &s2;

此時指標sp1中所存的地址由s1的地址變為了s2的地址,s1值不改變。

6.       區分指標和引用

引用總是指向某個對象,定義時必須初始化。而且引用被賦值是修改該引用所關聯的對象的值,並不是使引用和另一個對象關聯。

例如:int &ri = ival;  int&ri2 = ival2;

             ri = ri2; //此時只是將ival的值修改成了和ival2相同而已。ri依舊是引用的ival

7.      二重指標:指向指標的指標。

int ival = 1024;   int *p = &ival;   int **pp = &p;

此時p中存的是ival的記憶體位址,pp中存的是指標p的地址。兩次解引用得到ival的值

例如:**pp == ival; 
這是成立的。

以此類推:還有三重指標等,當然不常用了,使用時要小心。

8.      指標與數組

a)        C++中使用數組名,自動轉換為指向數組第一個元素的指標。

b)        如果有int arr[5] = {0,1,2,3,4};  int*p = arr;

指標p進行加減操作即改變所指元素,加1為指向下一個元素,減1為指向上一個元素(注意防止越界)。++、--
操作同理。

c)        兩個指向同一數組的指標可以做減法操作。例如:int *p2 = &arr[4];

則,p2 – p1==4;成立。減法操作結果為ptrdiff_t類型(是signed整型,可以是負數)。

d)        允許指標加減0.兩個null 指標相減結果仍為0.

e)        數組的下標運訪問元素時,實際上是對指向數組元素的指標做下標操作。

f)         C++允許計算數組或對象的超出末端的地址,但不允許對此地址進行解引用操作。而計算數組超出末端位置之後或數組首地址之前的地址都是不合法的。常用數組末端的下一個元素做“哨兵”。

9.      指標和const限定修飾符

a)        const int *p;  //p不是const的。可以不初始化p,可以更改p指向的對象;

b)        不能用void*指標儲存const對象的地址,必須用const void*指標儲存const對象的地址

c)        允許把非const對象的地址賦給指向const對象的指標,但是不能通過p更改指向對象的值:

int a = 3; p = &a;

a=4;//可以       *p = 5;//錯誤

d)        const指標:指標一旦初始化不能再更改指向的對象

int c = 8;                    int*const cp = &c;

cp只能指向c不能再指向別的對象,可以通過cp更改c的值

e)        指向const對象的const指標:既不能修改指標所指對象的值,也不允許指標再指向別的對象:

const int d = 6;  constint *const dp = &d;

int c = 9;   dp =&c; //錯誤   *dp = 7; //錯誤

f)         注意陷阱:typedefstring *pstring;

const pstring cstr;

                   cstr的真正類型是:string *const cstr;  
而不是const string *cstr;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.