zoukankan      html  css  js  c++  java
  • C++之指针例题解析

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

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

     1 #include <iostream>
     2 
     3 using namespace std;
     4 
     5 int main(int argc,char** argv)
     6 {
     7     char *str[]={"welcome","to","boyaa","shenzhen"};
     8     char**p=str+1;
     9 
    10     str[0]=(*p++)+1;
    11     str[1]=*(p+1);
    12     str[2]=p[1]+3;
    13     cout<<str[2]-str[1]<<endl;
    14 
    15     str[3]=p[0]+(str[2]-str[1]);
    16     cout<<str[0]<<" "<<str[1]<<" "<<str[2]<<" "<<str[3]<<endl;
    17     return 0;
    18 }

    代码运行结果是:

    3
    o shenzhen nzhen en
    
    Process returned 0 (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

    我要坚持一年,一年后的成功才是我想要的。
  • 相关阅读:
    08.Linux系统-Fastdfs分布式文件系统-互为主从配置搭建部署
    07.Linux系统-GitLab版本控制服务安装部署
    06.Linux系统-WCP知识共享平台安装部署(旗舰版)
    01.Linux-CentOS系统清理缓存脚本
    15.Linux-CentOS系统重启网卡ping不通问题(云环境)
    14.Linux-CentOS系统proc文件系统丢失
    设置环境变量遇到的难题,cmd管理员方式与普通方式的区别,通过C#代码设置环境变量
    DataGridView 行数据验证:当输入数据无效时不出现红色感叹号的Bug
    VS2017新建项目的模板之配置
    禅道安装
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/5968038.html
Copyright © 2011-2022 走看看