C++ (int *) 和 & 有什么区别?
In C++ what is the difference between (int *) and &?
我是编程新手,只是自己修补,以更好地了解书本课程中涵盖的概念;但是,我找不到以下解释: 在下面的代码中,为什么返回的地址使用 (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 的指针或指向无符号字符的指针,但不能反过来。
原因是有些架构中整数和其他大型类型必须位于某个地址(例如,位于 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'
当你执行&cat
时,其中cat
是一个指针,你会得到存储cat
本身的内存位置。
当你做(int*) cat
时,你只是把cat
的内容解释为一个int*
。
如果这两者是等价的,那将是非常出乎意料的。
使用 &
表示"地址"。
使用 (int *)
意味着"将值视为地址"。
因此,在这种情况下,(int *)
将值"tiger"视为int
指针。 *(有点(
*有点复杂。 它不完全是"tiger"
的值,因为它是从const char *
而不是字符串文字本身强制转换的。 相反,cat
是指向"tiger"
在内存中的位置的指针,因此(int *)cat
实际上是指向cat
在内存中的位置的整数指针。
另一方面,&cat
是cat
的地址 - 实际上是指向"tiger"
的指针的地址。
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?
- ascii 和 unicode 在处理级别有什么区别吗?
- C 中的常量限定符和 C++ 中的常量限定符有什么区别?
- "ABC" 和 "ABC" ) 在C++中有什么区别?
- 空指针常量 (nullptr)、空指针值和空成员指针值之间有什么区别?
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 两种访问I2C总线的方法有什么区别?
- 两种模板示例有什么区别?
- 这两种C++语法之间有什么区别?
- lua 5.0.2 模块和 5.3.5 有什么区别?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- std::enable_if 和 std::enable_if_t 有什么区别?