*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)经常被用作循环数组的终止符。

采用空指针做为终止符,在数组中改变元素时,就没必要改动遍历数组的代码,由于此时数组仍然以空指针做为结束。

固然也能够以数组元素的个数做为循环结束的标志,但这样须要有一个计数器。而使用空指针,则不须要。

相关文章
相关标签/搜索