如何显示 C++ char 变量的内存地址?[复制]

How to display a C++ char variable's memory address? [duplicate]

提问人:ekanlar 提问时间:7/16/2023 最后编辑:Remy Lebeauekanlar 更新时间:7/17/2023 访问量:78

问:

在练习使用 C++ 时,我尝试使用运算符显示变量的地址,但我看到的是一行毫无意义的字符而不是内存地址。char&

以下是完整的程序:

#include <iostream>
using namespace std;

int main()
{
    char a;
    a = 'a';

    cout << &a;
}

下面是我看到的输出显示:

Memory address of a char variable in C++

我试图在网上搜索以找到有关此问题的解决方案和详细信息,但我找不到任何有用的东西。

C++ 变量 char 内存地址

评论

0赞 Huy Nhat Tran 7/16/2023
&a将返回并认为您要打印指向 的字符串。所以你可以把它投射成这样char*cout&aintcout << int(&a)
0赞 Useless 7/16/2023
有一个运算符<<重载用于处理 C 字符串。只需将其转换为其他东西,例如static_cast<uintptr_t>(&a)
0赞 PaulMcKenzie 7/16/2023
由于对 使用非 null 终止字符缓冲区,程序具有未定义的行为。cout
0赞 Remy Lebeau 7/17/2023
如果要打印指针,然后打印指针,请不要将其强制转换为整数。 具有 的重载,所有指针都可以转换为重载,例如:operator<<void*cout << static_cast<void*>(&a)
0赞 drescherjm 7/17/2023
您看到的输出是由于 IDE 在调试版本中作为调试助手填充内存所致。请记住识别此符号:https://stackoverflow.com/a/127404/4878920xCC

答:

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。