指向指针数组的指针
指针的指针另一用法是处理指针数组。有些程序员喜欢用指针数组来代替多维数组,一个常见的用法就是处理字符串。
#include<iostream>
#include<cstdio>
using namespace std;
char *Names[] =
{
"hello",
"world",
"nihao",
NULL //最好以NULL结尾
};
int main()
{
//二维指针通常会与指针数组一起使用。
char **nm = Names; //注意Names前没有加&,可能结合一维数组给int*赋值时的情形理解。
//关于*num++执行效果的分析。感觉对操作符的理解更深刻了,首先这个表达式中有一个操作符,即nm.执行了两种运算,解引用,指针num加1运算。
//因为解引用优先级高先进行,输出字符串,之后再进行++,问题就出在这里:++到底是对谁进行的呢?结果现在已经知道是num,而不是*num.
//*和++本质上无差别,都是运算符。它们的操作数都是num.所以不要想当然地认为操作数是*num.
//总结:在一个表达式中分清操作数和运算符。运算符的操作数是哪个。要改变运算符的操作数只能通过(对表达式)加括号来改变。
while (*nm != 0) printf("%s \n", *nm++); // *优先级高于++,对于char*的加1运算应该不是移动一个字节,而移动到本字符串结束符后的一位。
char* str = "hello\0world";
str = str + 1; //输出ello
cout << str << endl;
system("pause");
return 0;
}
写在后面:
对于下面这条语句中的表达式
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
下面只是我的一些猜想,编译器可能并不是这样分析的。
- 开始找移位运算第二个操作数,记为operand2,
- 发现4,+,因为加法运算优先级高,所以移位运算的operand2暂时还无法确定。但是肯定与4的加法运算有关。先完成加法运算的分析。
- 发现2,和分号;语句结束。加法的第二个操作数是2,计算4+2,得到6.将其作为operand2的值。
- 进行移位运算3<<6;
关于char* names[]中最后一个字符串设置为NULL的深意。
数组中的最后一个元素被初始化为NULL,while循环以此来判断是否到了数组末尾。
空指针(NULL)常常被用做循环数组的终止符。
采用空指针作为终止符,在数组中改变元素时,就不必改动遍历数组的代码,因为此时数组仍然以空指针作为结束。
当然也可以以数组元素的个数作为循环结束的标志,但这样需要有一个计数器。而使用空指针,则不需要。