鱼C论坛

 找回密码
 立即注册
查看: 1665|回复: 6

[已解决]C++ cout<<&char_typename的疑惑

[复制链接]
发表于 2022-5-1 21:06:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
大家好!第一次发提问贴,在提问之前百度了好久都没有找到答案,我想问的核心问题是:声明一个char类型的变量,比如char ch1 = 'a'; 那么cout<<&ch1的结果该怎么解释?&ch1又代表什么呢,我的代码和运行结果如下:
#include <iostream>
#include <cstring>
int main()
{
    using namespace std;
    char ch = 'b';
    cout << ch << endl;         // print the letter
    cout << &ch << endl;        // still don't know print what
    cout << (void *)ch << endl; // print address

    char ch2 = 'c';
    cout << ch2 << endl;         // print the letter
    cout << &ch2 << endl;        // still don't know print what
    cout << (void *)ch2 << endl; // print address

    char ch3 = 'd';
    cout << ch3 << endl;         // print the letter
    cout << &ch3 << endl;        // don't know
    cout << (void *)ch3 << endl; // print address
    return 0;
}
运行结果输出如下:
b
b
0x62
c
cb
0x63
d
dcb
0x64
不会上传截图所以用代码格式,由这个输出结果我产生了两个新的疑惑:第一个是单个字符变量的地址正好与ASCII码是对应的,这是巧合吗,还是计算机分配地址的某种规则,我该如何了解这块的知识?第二个问题就是开头提到的,当我cout<<&char_variable;的时候,第一个字符变量输出了这个字符本身加一个无法打印的字符;第二个字符变量依次输出了第二个字符和第一个字符和无法打印字符;第三个字符变量依次输出了第三个字符第二个字符和第一个字符和无法打印字符,请问大家该如何理解呢?谢谢大家!
最佳答案
2022-5-2 08:33:15
我尝试用不同的编译器运行你的代码,结果完全不同。包括 MSVC、LLVM Clang-cl、gcc...

你的..
问题一:第一个是单个字符变量的地址正好与 ASCII 码是对应?因为你强制把它变成空指针类型啊,并不是真正内存地址,就好象你随意取个地方名字一样。
问题二:我已经试过不同编译器,会产生不同结果,有的如你的一样,第一个字符一样,后面乱码,有的只是打印正确字符,有的则打印超长乱码,简单的说结果毫无意义,没有值得探究的地方。在 C++ 里,一般 & 都是右值引用,并不是像你的代码那样用法。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-2 00:13:21 | 显示全部楼层
1、cout<<&ch1的含义:从ch1变量的地址开始,把这个地址作为字符串格式解析;(并不是你理解的打印地址,你可以尝试使用C语言的printf格式打印地址可以看到实际的地址);
2、你使用(void *)强转的方式我这边MinGW编译器编译通过,但是有警告,运行结果与你的也是不一样的(我这边没有打印出任何信息);
3、猜测:你(void *)ch1实际上是将ch1的数据强转为了一个指针地址,然后你的编译器直接将这个地址打印出来了,但是我的编译器并没有这样打印;
4、所以,我猜测你打印的数据里面实际上没有任何一个是对应变量的地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-2 08:33:15 | 显示全部楼层    本楼为最佳答案   
我尝试用不同的编译器运行你的代码,结果完全不同。包括 MSVC、LLVM Clang-cl、gcc...

你的..
问题一:第一个是单个字符变量的地址正好与 ASCII 码是对应?因为你强制把它变成空指针类型啊,并不是真正内存地址,就好象你随意取个地方名字一样。
问题二:我已经试过不同编译器,会产生不同结果,有的如你的一样,第一个字符一样,后面乱码,有的只是打印正确字符,有的则打印超长乱码,简单的说结果毫无意义,没有值得探究的地方。在 C++ 里,一般 & 都是右值引用,并不是像你的代码那样用法。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-2 11:34:35 | 显示全部楼层
&ch 得到 ch 的地址,类型 char* 。
但 char* 常常用于表示字符串,所以 cout << &ch << endl; 打印了一个不存在的字符串(实际上除了第一个字符一定是 ch 存储的字符,剩下的内容都是未知的),而非 ch 的地址。
(void*)ch 把 ch 存储的字符当作一个数来处理,并转换为一个地址。0x62 = 98 就是 'b' 的 ASCII 码。
如果你想得到 ch 的地址,应该这么写:
cout << (void*)(&ch) << endl;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-3 00:06:09 | 显示全部楼层

感谢uu的评论,我用的是TDMGCC,我又试了很多次,发现cout<<&ch1会解析为字符串,如果没有空字符作为结束作为标志,结合评论区的uu,不同的编译器处理不同;但是要是显示该字符的存储地址我试了用(void*)和(int*)都可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-3 00:07:25 | 显示全部楼层
傻眼貓咪 发表于 2022-5-2 08:33
我尝试用不同的编译器运行你的代码,结果完全不同。包括 MSVC、LLVM Clang-cl、gcc...

你的..

谢谢UU,我后来醒悟了,数字转化为指针类型大概就是转化为一个地址,而地址就是用十六进制表示的;于是他把ASCII码转化成了16进制
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-3 00:08:23 | 显示全部楼层
永恒的蓝色梦想 发表于 2022-5-2 11:34
&ch 得到 ch 的地址,类型 char* 。
但 char* 常常用于表示字符串,所以 cout

谢谢UU,我还发现(void*)和(int*)都可以输出正确的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-17 19:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表