指针笔试题

 

#include<iostream>
using namespace std;
int main()
{
    char *str[]={"welcome","to","Fortemedia","Nanjing"};
    char**p=str+1;
    str[0]=(*p++)+2;
    str[1]=*(p+1);
    str[2]=p[1]+3;
    str[3]=p[0]+(str[2]-str[1]);
    cout<<str[0]<<endl;  //输出'\0'
    cout<<str[1]<<endl;  //输出Nanjing
    cout<<str[2]<<endl;  //输出jing
    cout<<str[3]<<endl;  //输出g
    return 0;
}

str:指针数组,str的值是这个数组首个元素的地址,这个地址存放了0xA

地址    元素          地址    元素

str     0xA          0xA    welcome\0

str+1    0xB          0xB    to\0

str+2    0xC          0xC    Fortemedia\0

str+3    0xD          0xD    Nanjing\0

 

char**p=str+1;

p首先和*结合,说明p是一个指针,指向char*类型

str+1: str数组第二个元素存放的地址,所以p存放的是地址str+1

 

str[0]=(*p++)+2;

*p:p所存地址str+1这个地址放的值,即0xB

*p+2,即该地址后面的第三个字符,即to后面的‘0’

p=p+1,因为p指向的char*,所以p=p+4,即p指向地址str+2,即p存放的值是地址str+2

则地址  元素

str    0xB+2,即to后面‘\0’的地址

 

str[1]=*(p+1);

p+1,指向str+3地址,改地址存放的值是0xD;

所以*(p+1)的值为0xD,cout输出0xD开始到‘\0’的内容,即即Nanjing;

则地址  元素

str+1  0xD,即Nanjing中N的地址

 

str[2]=p[1]+3;

p存放的值为str+2,p[1]等价于*(p+1),即str+3地址存放的值0xD;

0xD+3,即输出Nanjing从j开始到‘\0’的字符

则地址  元素

str+2  0xD+3,即Nanjing中j的地址

 

str[3]=p[0]+(str[2]-str[1]);

str[2]-str[1] = 3

p[0]等价于*p,p存放的值是str+2,所以*p的值是0xD+3;

所以str[3] = 0xD+3+3,即输出Nanjing的第6位开始的值,即g到'\0';

则地址  元素

str+3  0xD+6,即Nanjing中g的地址

 

posted @ 2016-04-17 14:53  寒风晓月  阅读(423)  评论(0编辑  收藏  举报