指向指針數組的指針
指針的指針另外一用法是處理指針數組。有些程序員喜歡用指針數組來代替多維數組,一個常見的用法就是處理字符串。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
下面只是個人一些猜測,編譯器可能並非這樣分析的。
關於char* names[]中最後一個字符串設置爲NULL的深意。
數組中的最後一個元素被初始化爲NULL,while循環以此來判斷是否到了數組末尾。
空指針(NULL)經常被用作循環數組的終止符。
採用空指針做爲終止符,在數組中改變元素時,就沒必要改動遍歷數組的代碼,由於此時數組仍然以空指針做爲結束。
固然也能夠以數組元素的個數做爲循環結束的標誌,但這樣須要有一個計數器。而使用空指針,則不須要。