文档章节

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

zray4u
 zray4u
发布于 2016/07/13 11:30
字数 852
阅读 27
收藏 1

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

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

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

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

 

© 著作权归作者所有

zray4u
粉丝 0
博文 216
码字总数 188982
作品 0
西城
私信 提问
C++11 FAQ中文版:weak_ptr

二 25 Year 2011 陈 良乔 C++11 FAQ weak_ptr 弱指针(weak pointer)经常被解释为用来打破使用shared_ptr管理的数据结构中循环(?)。但是我认为,将weak_ptr看成是指向具有下列特征的对象的指...

长平狐
2013/01/11
269
0
关于二维指针强制转换及传递的简单剖析

关于二维指针强制转换及传递的简单剖析。 C语言中的两大利器:强制转换、指针。很多小伙伴在学习C语言的过程中都遇到过一支拦路虎,那就是指针。 C很自由,但是自由同样暗示着你需要付出更多...

so_foolish
2017/04/01
0
0
C++ weak pointer

智能指针根据指向对象的指针个数是否为0判断是否释放对象。该过程是在指针调用析构函数的时候发生,可见智能指针本质上也是一个对象。一个具有指针特性的对象。析构时默认调用delete进行对象...

thoresa
2015/05/19
0
2
测试下C语言的基础水平(答案)

第一题 分析:主要考察setjump和longjump这两个函数的作用。从英文字面意思我们可以知道是跳转,程序的非本地跳转。 只要知道了这两个函数的功能,就很容易知道本题的答案为:(b) 5 第二题 ...

开心303
2011/08/05
0
0
C Primer Plus 第9章 函数 9.7 指针简介

一般来讲,指针是一个其数值为地址的变量(或更一般地说是一个数据对象)。 正如char类型的变量用字符作为其数值,而int类型变量的数值是整数,指针变量的数值表示的是地址。 如果您将某个指...

idreamo
2016/07/15
23
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈 linux 多线程编程和 windows 多线程编程的异同

很早以前就想写写linux下多线程编程和windows下的多线程编程了,但是每当写时又不知道从哪个地方写起,怎样把自己知道的东西都写出来,下面我就谈谈linux多线程及线程同步,并将它和windows...

shzwork
3分钟前
0
0
java系统高并发的解决方案

一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业...

孤狼悲月
9分钟前
0
0
Python之父:为什么操作符很有用?

这是我在python-ideas上发布的一些东西,但我认为这些很有趣,应该分享给更多的人。 最近有很多关于合并两个dict(词典)的运算符的讨论。 这促使我思考为什么有些人喜欢运算符,我想起了30多年...

糖宝lsh
27分钟前
0
0
gitlab

开源项目汇总https://hellogithub.com/periodical/category/Go%20%E9%A1%B9%E7%9B%AE/?page=5

whhbb
31分钟前
0
0
微信和网页版跳转到导航 js函数

小程序有本身自带的方法能跳转到导航那么网页和微信呢也有 function Dh(){ if(ua.match(/MicroMessenger/i) == 'micromessenger'){ wx.config({ deb......

xiaogg
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部