指针笔试题
#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的地址