看了挺长一段时间的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