看了挺长一段时间的C了,基本上是把基础语法过关了,偶然遇见一个C++的面试题,分析一下,作为一段时间的打卡。

代码在编译器里边打一下,

 #include <iostream>

 using namespace std;

 int main(int argc,char** argv)
{
char *str[]={"welcome","to","boyaa","shenzhen"};
char**p=str+; str[]=(*p++)+;
str[]=*(p+);
str[]=p[]+;
cout<<str[]-str[]<<endl; str[]=p[]+(str[]-str[]);
cout<<str[]<<" "<<str[]<<" "<<str[]<<" "<<str[]<<endl;
return ;
}

代码运行结果是:

o shenzhen nzhen en

Process returned  (0x0)   execution time : 0.366 s
Press any key to continue.

下面是自己简单的分析过程,中途可能会有些小错误(大家给我提醒)————————》

首先是一些初始化步骤。

i)申请一个字符串数组,也就是数组中保存的都是字符串的地址:
char *str[]={"welcome","to","boyaa","shenzhen"};
str在这里相当于是个常量的二级指针

ii)定义一个二级指针char**p=str+1;
同时给P赋值&str[1]

iii)好的,重头戏来了,回到刚刚提到的str字符串数组。一下都是对字符串数组的一系列操作
str[0]=(*p++)+1;
str[1]=*(p+1);
str[2]=p[1]+3;
cout<<str[2]-str[1]<<endl;

1)首先第一个(*p++)+1,其中的*p++优先级是*(p++),然后先将p的值返回给表达式,相当于*p,p++;
那么str[0]=*p+1等价于str[1]+1等价于str[1][2],也就是从to的第二个字母开始到最后
请注意,这个时候的字符串数组变化了,变成
char *str[]={"o","to","boyaa","shenzhen"};

2)好的,第二个
str[1]=*(p+1);其中*(p+1)等于*(&str[2]+1)等于*(&str[3])等于str[3],也就是有
char *str[]={"o","shenzhen","boyaa","shenzhen"};

3)第三个str[2]=p[1]+3;其中的p[1]+3等价于str[3]+3等价于"shenzhen"+3等价于"nzhen"
"shenzhen"并不是一个字符串,是一个地址。所有的字符串常量都是地址。
这个时候也就是将"nzhen"的地址赋值给str[3],所以有变化
char *str[]={"o","shenzhen","nzhen","shenzhen"};

4)那么最后是进行第一个输出
cout<<str[2]-str[1]<<endl;
看起来好像是两个字符串相减,结果是字符串的首地址相减的值"shenzhen"-"nzhen"等于s的地址减去n的地址
结果是3

5)第五步是接着赋值,str[3]=p[0]+(str[2]-str[1]);
也就是str[3]="nzhen"+3="en",这是一个地址的运算操作
更新str有
char *str[]={"o","shenzhen","nzhen","en"};

6)最后是结果输出
cout<<str[0]<<" "<<str[1]<<" "<<str[2]<<" "<<str[3]<<endl;
o shenzhen nzhen en

C++之指针例题解析的更多相关文章

  1. 娓娓道来c指针 (4)解析c的声明语句

    (4)解析c的声明语句 在继续探索c指针之前.有必要来解析下c语言中复杂的声明语法. 仅仅须要记住两则:一个原则,一个规则. 原则:先看标示符. 规则:运算符优先级是规则. 举例说明 1.最简单的 i ...

  2. 《编译原理》画 DAG 图与求优化后的 4 元式代码- 例题解析

    <编译原理>画 DAG 图与求优化后的 4 元式代码- 例题解析 DAG 图(Directed Acylic Graph)无环路有向图 (一)基本块 基本块是指程序中一顺序执行的语句序列, ...

  3. 《编译原理》构造 LL(1) 分析表的步骤 - 例题解析

    <编译原理>构造 LL(1) 分析表的步骤 - 例题解析 易错点及扩展: 1.求每个产生式的 SELECT 集 2.注意区分是对谁 FIRST 集 FOLLOW 集 3.开始符号的 FOL ...

  4. 《编译原理》控制流语句 if 和 while 语句的翻译 - 例题解析

    <编译原理>控制流语句 if 和 while 语句的翻译 - 例题解析 将 if 和 while 语句翻译成四元式 注:不同教材会有小差异,使用 _ 或者 - ,如果是 -,请注意区分 - ...

  5. 《编译原理》LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析

    <编译原理>LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析 笔记 直接做题是有一些特定步骤,有技巧.但也必须先了解一些基本概念,本篇会通过例题形式解释概念,会容易理解和记忆,以 ...

  6. 《编译原理》求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析

    <编译原理>求 FIRSTVT 集和 LASTVT 集的步骤 - 例题解析 算符优先关系表的构造中涉及到求 FIRSTVT 集和 LASTVT 集. 表示及含义: FIRSTVT(T) 非 ...

  7. 《编译原理》构造与正规式 (0|1)*01 等价的 DFA - 例题解析

    <编译原理>构造与正规式 (0|1)*01 等价的 DFA - 例题解析 解题步骤: NFA 状态转换图 子集法 DFA 的状态转换矩阵 DFA 的状态转图 解: 已给正规式:(0|1)* ...

  8. Lucas(卢卡斯)定理模板&&例题解析([SHOI2015]超能粒子炮·改)

    Lucas定理 先上结论: 当p为素数: \(\binom{ N }{M} \equiv \binom{ N/p }{M/p}*\binom{ N mod p }{M mod p} (mod p)\) ...

  9. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

随机推荐

  1. Linux 中 crontab 详解及示例

    cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业.由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动.关闭这个服务: /sbin/service c ...

  2. 最受欢迎的Web开发工具

    1)WebBuilderWebBuilder是一款开源的可视化Web应用开发和运行平台.基于浏览器的集成开发环境,可视化和智能化的设计,能轻松完成常规应用和面向手机的移动应用开发:高效.稳定和可扩展的 ...

  3. 博客已迁移到lizhug.com

    新的博客地址 http://lizhug.com

  4. JAVA小知识点-Finally和Return的执行关系

    如果Try和Catch中存在return语句的时候Finally内的语句是否会执行,执行的时候对结果又有什么影响呢?我写了个例子来试验这个问题: public static Map<String ...

  5. Composite C1是一个.Net平台上开源专业的CMS开源项目

    CompositeC1 4 发布 Composite C1是一个.Net平台上开源专业的CMS开源项目,很多的功能用户界面,面向任务的支持与各种工具协作.当编辑内容时在用户端体验很友好.编辑器与开发者 ...

  6. mosquitto awareness when before it's being compiling, and you do settings and testing

    Mostly, this clearify the usage of   ' mosquitto.conf ' in easy-understanding language.   1. compile ...

  7. lua脚本中字符串分割split

    function split( s, c ) for item in string.gmatch( s, "(.-)"..c) do print(item); end end s ...

  8. 那天有个小孩教我WCF[一][1/3]

    那天有个小孩教我WCF[一][1/3] 既然是小孩系列,当然要有一点基础才能快速掌握,归纳,总结的一个系列,哈哈 前言: 第一篇嘛,不细讲,步步教你创建一个简单SOA案例,对WCF有个基本的认识,我不 ...

  9. 让C#、VB.NET实现复杂的二进制操作

    VB.NET和C#属于高级语言,对二进制位操作的支持不是很好,比如没有了移位运算等,用的时候确实很不方便,所以在闲暇之余我重新封装了一个用于C#.VB.NET的位操作类库,通过该类库可以实现数据移位. ...

  10. Ubuntu 下的环境变量配置

    网上很多配置jdk环境变量的方法,但是几乎都会下次重启电脑就失效,或者时不时的失效.下面教你一招 JDK环境变量配置如下: 执行命令sudo gedit /etc/environment,在打开的编辑 ...