指向指针数组的指针
指针的指针另外一用法是处理指针数组。有些程序员喜欢用指针数组来代替多维数组,一个常见的用法就是处理字符串。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)经常被用作循环数组的终止符。
采用空指针做为终止符,在数组中改变元素时,就没必要改动遍历数组的代码,由于此时数组仍然以空指针做为结束。
固然也能够以数组元素的个数做为循环结束的标志,但这样须要有一个计数器。而使用空指针,则不须要。