*ptr++的计算过程(ptr是一个二维指针)

指向指针数组的指针
指针的指针另一用法是处理指针数组。有些程序员喜欢用指针数组来代替多维数组,一个常见的用法就是处理字符串。

#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

下面只是我的一些猜想,编译器可能并不是这样分析的。

  1. 开始找移位运算第二个操作数,记为operand2,
  2. 发现4,+,因为加法运算优先级高,所以移位运算的operand2暂时还无法确定。但是肯定与4的加法运算有关。先完成加法运算的分析。
  3. 发现2,和分号;语句结束。加法的第二个操作数是2,计算4+2,得到6.将其作为operand2的值。
  4. 进行移位运算3<<6;

关于char*  names[]中最后一个字符串设置为NULL的深意。

数组中的最后一个元素被初始化为NULL,while循环以此来判断是否到了数组末尾。

空指针(NULL)常常被用做循环数组的终止符。

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

当然也可以以数组元素的个数作为循环结束的标志,但这样需要有一个计数器。而使用空指针,则不需要。

 

转载于:https://my.oschina.net/ray1421/blog/711001

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值