提问人:ekanlar 提问时间:7/16/2023 最后编辑:Remy Lebeauekanlar 更新时间:7/17/2023 访问量:78
如何显示 C++ char 变量的内存地址?[复制]
How to display a C++ char variable's memory address? [duplicate]
问:
在练习使用 C++ 时,我尝试使用运算符显示变量的地址,但我看到的是一行毫无意义的字符而不是内存地址。char
&
以下是完整的程序:
#include <iostream>
using namespace std;
int main()
{
char a;
a = 'a';
cout << &a;
}
下面是我看到的输出显示:
我试图在网上搜索以找到有关此问题的解决方案和详细信息,但我找不到任何有用的东西。
答:
3赞
Wander Nauta
7/16/2023
#1
指向字符的指针 - 被视为指向 C 样式字符串的指针,并像打印一样打印,即使它不在程序中:C 样式字符串是字符数组,然后是终止 NUL 字节。因为 NUL 字节不存在,所以打印了无意义的垃圾。char *
C 样式字符串早于 C++ 和 ,但它们仍然是语言的一部分;例如,字符串文字 like 也是 C 样式的字符串。<iostream>
"hello"
如果要打印地址,一种方法是将指针转换为:void *
#include <iostream>
using namespace std;
int main()
{
char a;
a = 'a';
cout << static_cast<void *>(&a);
}
这样一来,你就可以得到 that 的重载,它可以打印任何类型的指针作为其内存地址,而不是 that 打印 C 样式字符串的重载。operator<<
operator<<
评论
2赞
Pete Becker
7/16/2023
次要点:被视为指向 C 样式字符串的指针。C 样式字符串是以 nul 结尾的数组。+1.char *
char
0赞
Remy Lebeau
7/17/2023
"因为那个 NUL 字节不存在,所以打印了无意义的垃圾“——这是一种可能的结果。从技术上讲,打印没有 null 终止符的以 null 结尾的字符串的行为是未定义的,因此从字面上看,任何事情都可能发生。你可以打印垃圾。您可能会使应用程序崩溃。你可能会丢弃内存。等等。
0赞
ekanlar
7/17/2023
我对“指针”部分感到困惑。我的理解是,我创建的是一个 char 变量,而不是一个 char 指针。在我阅读的所有来源中,“&”符号都被称为“运算符的地址”。因此,如果我创建一个整数 int a,我通过显示 &a 来获取变量的内存地址。为什么它不能以相同的方式处理 char 变量?
0赞
stark
7/17/2023
&a 是指向 a 的指针,这使得它的类型为 。cout 具有特定的重载char *
char *
0赞
stark
7/18/2023
自动更正插入了错误的 it。
上一个:为什么 C++ 条件变量需要锁?
评论
&a
将返回并认为您要打印指向 的字符串。所以你可以把它投射成这样char*
cout
&a
int
cout << int(&a)
运算符<<
重载用于处理 C 字符串。只需将其转换为其他东西,例如static_cast<uintptr_t>(&a)
cout
operator<<
void*
cout << static_cast<void*>(&a)
0xCC