看了挺长一段时间的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. EasyUI DataGrid及Pagination

    接上一篇EasyUI项目驱动学习 DataGrid数据表格及Pagination分页一起介绍 一.通过<table>标记创建DataGrid,嵌套<th>标签定义列表 < ...

  2. weblogic配置修改java代码后不需要重启热部署方式

    我用的是weblogic8.x 在项目的WEB-INFO中创建weblogic.xml --------以下内容复制到weblogic.xml中------------ <!DOCTYPE we ...

  3. JavaScript面向对象编程(一)原型与继承

    原型(prototype) JavaScript是通过原型(prototype)进行对象之间的继承.当一个对象A继承自另外一个对象B后,A就拥有了B中定义的属性,而B就成为了A的原型.JavaScri ...

  4. ASP.NET基础之HttpModule学习

    最近学习WCF知识时看到有关IIS版本的知识,发现对HttpContext,HttpModule,HttpHandler的内容都不是很了解,这三个也是ASP.NET相对基础的内容,晚上特地花点时间针对 ...

  5. 半同步半异步模式的实现 - MSMQ实现

    半同步半异步模式的实现 - MSMQ实现 所谓半同步半异步是指,在某个方法调用中,有些代码行是同步执行方式,有些代码行是异步执行方式,下面我们来举个例子,还是以经典的PlaceOrder来说,哈哈. ...

  6. 设计模式——(Abstract Factory)抽象工厂

    设计模式——(Abstract Factory)抽象工厂 设计面向对象软件比较困难,而设计可复用的面向对象软件就更加困难.你必须设计相关类,并设计类的接口和继承之间的关系.设计必须可以解决当前问题,同 ...

  7. CF 322B Ciel and Flowers 贪心水题

    B. Ciel and Flowers time limit per test 1 second memory limit per test 256 megabytes input standard ...

  8. Python 入门介绍

    写在前面 开始介绍Python之前, 先回顾一下编译型语言和解释型语言的概念和区别. 计算机能直接识别只能是机器语言, 所以使用高级语言编写的程序必须翻译成机器语言,计算机才能执行. 翻译的方式有两种 ...

  9. Android打开系统设置

    今天在做项目过程中,遇到一个问题:用户体验某个功能时需要查看用户是否已经打开了GPS定位服务,若没有则要求进入定位服务设置界面. 下面就直接贴出代码 以下代码是放在了Button的监听事件里,只贴出重 ...

  10. Javascript 闭包与变量

    1.闭包与变量 JavaScript中的作用域链的机制引出了一个副作用,即闭包只能取得包含函数中任何变量的最后一个值.闭包所保存的是整个变量对象,而不是某个特殊的值. 1 2 3 4 5 6 7 8 ...