(c++) 将 int 转换为 char 指针(int 是 int 形式的字符)

Posted

技术标签:

【中文标题】(c++) 将 int 转换为 char 指针(int 是 int 形式的字符)【英文标题】:(c++) Casting int to char pointer (int being character in int form) 【发布时间】:2016-04-13 13:01:33 【问题描述】:

所以基本上我希望能够按照这些思路做一些事情

char *test1 = "hey";
int test2 = (int)test1;
char *test3 = (char*) &test2;
printf("%s", test3);
// have the output as hey

这甚至可能吗?我知道这不能正常工作,但我只想知道是否有工作方法。是的,我想使用 char 指针和整数,所以不,我不想使用字符串

【问题讨论】:

C++: Is it safe to cast pointer to int and later back to pointer again? 请注意,char *test1 = "hey"; 不应编译。一些编译器具有允许这样做的扩展,但您应该使用 char test1[] = "hey";const char* test1 = "hey"; 或更好的是 std::string test = "hey"; 什么甚至可能吗?您已经编写了一些代码,这些代码执行了一些不确定的强制转换,这些强制转换可能会或可能不会做一些明智的事情。你想完成什么? 出于兴趣,为什么要这样做? @JohnnyMopp - 虽然这很重要,但这并不是这里真正发生的事情。还有另一层间接,用(char*)&test2 初始化test3。注意&——它使用test2地址 【参考方案1】:
char *test1 = "hey";
int test2 = (int)test1;
char *test3 = (char*) test2; // Note that the ampersand has been removed
printf("%s", test3);

如果ints 和指针大小相同(通常是这样,但不能保证),可能会起作用。

但是当您分配test3 时,您使用的是test2 的地址,而不是它的值,我认为这是您真正想要做的。

【讨论】:

指针通常是无符号整数。 如果您想为用户提供应有的声誉,请勾选“已接受”的答案;) @AhmetIpkin 此答案表现出未定义的行为,不应被接受。将指针转换为 int 是未定义的行为。将字符串文字转换为指向可变字符的指针是未定义的行为。将字符串文字(间接)转换为指向可变 char 的指针也是未定义的行为。 @RichardHodges 将char * 转换为int 不是未定义的行为(std::intptr_t 是可选的,大多数情况下是uint_t),您只是在读取文字(修改该地址为 UB)。铸件是 C / C++ 上定义良好的操作。将字符串文字转换为 char 指针也不是 UB,它在任何理智的编译器中都是一个错误 - 可以通过分配给 const char* 来修复。 @AhmetIpkin 这个问题被标记为 c++。【参考方案2】:

代码代表未定义的行为,因此不正确。

不过,有一种方法可以合法地做你想做的事。解释见内联 cmets:

#include <cstddef>
#include <cstdint>
#include <cstdio>

int main()

    // string literals are const
    const char *test1 = "hey";

    // intptr_t is the only int guaranteed to be able to hold a pointer
    std::intptr_t test2 = std::intptr_t(test1);

    // it must be cast back to exactly what it was
    const char *test3 = reinterpret_cast<const char*>(test2);

    // only then will the programs behaviour be well defined
    printf("%s", test3);

【讨论】:

以上是关于(c++) 将 int 转换为 char 指针(int 是 int 形式的字符)的主要内容,如果未能解决你的问题,请参考以下文章

C++中如何将int或者char转化为string类

使用 C++ 样式转换将 int 转换为 char [重复]

C#和C C++调用dll变量转换问题,双指针?

C++怎么把int转换成char

为啥将“0”添加到 int 数字允许转换为 char?

使用指针在 C++ 中显示 char 变量的地址?