gpt4 book ai didi

c++ - 在 C++ 中,(int *) 和 & 有什么区别?

转载 作者:行者123 更新时间:2023-11-30 01:17:59 24 4
gpt4 key购买 nike

我是编程新手,只是靠自己修修补补,以便更好地理解书本类(class)中涵盖的概念;但是,我找不到以下内容的解释:在下面的代码中,为什么使用 (INT *) 返回的地址与使用 & 的地址不同?

  char animal[20] = "doberman";
const char * cat = "tiger";

std::cout << "\nanimal: " << animal << std::endl;
std::cout<< "cat: " << cat << std::endl;
std::cout << "-----\n";
std::cout << "&animal: " << &animal << std::endl;
std::cout << "&cat: " << &cat << std::endl;
std::cout << "(int *) cat: " << (int *) cat << std::endl;

最佳答案

您显示的代码是非法的(不可移植的 C++)。

语法 (int *) 表示字符串文字 "tiger" 的地址被转换为指向整数的指针,但这是不允许的,它可能导致未定义的行为。

您可以将任何指针类型转换为指向 char 的指针或指向 unsigned char 的指针,但不能反过来。

原因是在某些架构中,整数和其他大型类型必须位于特定地址(例如,位于 4 的倍数的地址)。对于未定义的行为,只需创建具有无效地址的指针就足够了(取消引用不是必需的,因为在某些 CPU 上,即使只是将无效地址加载到用于索引整数的寄存器也可能引发硬件陷阱)。

在 PC (x86) 上,转换不会产生问题(除非可能是性能问题),只是意味着编译器会将包含 "tige" 的内存视为整数.取消引用整数(即打印 *((int *)&cat))应该给出 1701276020

116 +           // ASCII code for 't'
105 * 256 + // ASCII code for 'i'
103 * 65536 + // ASCII code for 'g'
101 * 16777216 // ASCII code for 'e'

关于c++ - 在 C++ 中,(int *) 和 & 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23316624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com