今天在学习字符型变量的操作中编写程序发现一个很好玩的现象,就是用取地址符号“&”无法直接获得字符型变量的地址,具体情形如下:
程序长这个样子:
代码的形式也贴上来:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str("cxk you are too beautiful!");
for(auto &c:str)
{
c = toupper(c);
cout<<&c<<endl;
}
cout<<str<<endl;
return 0;
}
这是在学习用基于范围的for循环把string的小写字母改成大写字母的一个程序。
c是一个引用,每次循环中与str的当前字符捆绑在一起,如果在输出中不加“&”的话,那么会每一行输出一个str的字符(小写变大写后的),如下图:
然后,我试图用“&”输出每次循环中c的地址,然而输出的结果如图:
可以看到,每次&c都把整个string输出出来了。
后来我弄懂了原因,是由于C++把"cout << 字符型指针"这种输出格式安排给输出字符串了,就是说它被编译器解释为从指针开始一个接一个地输出内存单元里的字符,直到遇到'\0'时为止。
因此,如果要规避这种情况也就很简单,把c进行强制类型转换,就可以输出地址了,如图:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str("cxk you are too beautiful!");
for(auto &c:str)
{
c = toupper(c);
cout<<(void*)&c<<endl;
}
cout<<str<<endl;
return 0;
}
好玩!
另外,还有个好玩的,C++语句结尾需要有分号(;)但是好像没规定必须得有一个分号~
于是乎......
#include<iostream>
#include<string>
using namespace std;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
int main()
{
string str("cxk you are too beautiful!");;;;;;;;;;;;;;;;;;;;
for(auto &c:str)
{
c = toupper(c);;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cout<<(void*)&c<<endl;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}
cout<<str<<endl;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
return 0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
}
可以运行!
PS:转载注明出处,如有侵权请联系作者删除。