*ptr++的計算過程(ptr是一個二維指針)

指向指針數組的指針
指針的指針另外一用法是處理指針數組。有些程序員喜歡用指針數組來代替多維數組,一個常見的用法就是處理字符串。html

#include<iostream>
#include<cstdio>
using namespace std;
char *Names[] =
{
    "hello",
    "world",
    "nihao",
    NULL   //最好以NULL結尾
};ios

int main()
{
    //二維指針一般會與指針數組一塊兒使用。
    char **nm = Names;   //注意Names前沒有加&,可能結合一維數組給int*賦值時的情形理解。程序員


    //關於*num++執行效果的分析。感受對操做符的理解更深入了,首先這個表達式中有一個操做符,即nm.執行了兩種運算,解引用,指針num加1運算。
    //由於解引用優先級高先進行,輸出字符串,以後再進行++,問題就出在這裏:++究竟是對誰進行的呢?結果如今已經知道是num,而不是*num.
    //*和++本質上無差異,都是運算符。它們的操做數都是num.因此不要想固然地認爲操做數是*num.
    //總結:在一個表達式中分清操做數和運算符。運算符的操做數是哪一個。要改變運算符的操做數只能經過(對錶達式)加括號來改變。數組


    while (*nm != 0) printf("%s \n", *nm++);      // *優先級高於++,對於char*的加1運算應該不是移動一個字節,而移動到本字符串結束符後的一位。spa

    char* str = "hello\0world";
    str = str + 1;                                                   //輸出ello
    cout << str << endl;指針

    system("pause");
    return 0;
}htm

寫在後面:blog

對於下面這條語句中的表達式字符串

int val=3<<4+2;編譯器

如何理解?

對於表達式從左向右看,第一個操做數3,操做符是移位運算符。移位運算符是二元運算符,從右邊肯定其第二個操做數。是4,仍是(4+2),答案是後者。編譯器是如何肯定的呢?

C++ 運算符優先級列表 - brent's hut - C++博客
http://www.cppblog.com/aqazero/archive/2006/06/08/8284.html

下面只是個人一些猜測,編譯器可能並非這樣分析的。

  1. 開始找移位運算第二個操做數,記爲operand2,
  2. 發現4,+,由於加法運算優先級高,因此移位運算的operand2暫時還沒法肯定。可是確定與4的加法運算有關。先完成加法運算的分析。
  3. 發現2,和分號;語句結束。加法的第二個操做數是2,計算4+2,獲得6.將其做爲operand2的值。
  4. 進行移位運算3<<6;

關於char*  names[]中最後一個字符串設置爲NULL的深意。

數組中的最後一個元素被初始化爲NULL,while循環以此來判斷是否到了數組末尾。

空指針(NULL)經常被用作循環數組的終止符。

採用空指針做爲終止符,在數組中改變元素時,就沒必要改動遍歷數組的代碼,由於此時數組仍然以空指針做爲結束。

固然也能夠以數組元素的個數做爲循環結束的標誌,但這樣須要有一個計數器。而使用空指針,則不須要。

相關文章
相關標籤/搜索