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<<&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:转载注明出处,如有侵权请联系作者删除。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值