Samvel Asked:2020-12-12 22:19:21 +0000 UTC2020-12-12 22:19:21 +0000 UTC 2020-12-12 22:19:21 +0000 UTC C 和 C++。指向 int 的指针(int*) 772 这是C++中的代码 #include <iostream> using namespace std; int a; int* b; int main() { int d = 5; b = &d; a = (int)b; return 0; } 这是C中的相同代码 #include <stdio.h> int a; int* b; int main() { int d = 7; b = &d; a = (int)b; } 为什么相同的代码在 C 而不是 C++ 中工作。以及 C 如何将int* 转换为 int c++ 2 个回答 Voted Best Answer AnT stands with Russia 2020-12-13T02:17:22Z2020-12-13T02:17:22Z 在 C 和 C++ 中,指针到整数转换的结果值是实现定义的。然而: 在 C++ 中,从指针类型到整数类型的转换是根据reinterpret_cast. 规范reinterpret_cast明确指出,只有当整数类型的大小足以存储结果值时,才允许从指针类型转换为整数类型。在您的情况下,显然,该类型int无法存储将类型指针转换int *为整数类型的结果。所以代码是错误的。 在 C 中,将指针类型转换为整数类型不需要整数类型足够大。语言规范只说如果整数类型太小,行为是 undefined。 假设您的 C++ 和 C 平台具有相同的类型特征int *,并且int类型int太窄而无法容纳给定转换的结果,那么从 C++ 的角度来看,您的程序是病态的。同时,它是正确的,但从 C 的角度来看表现得模糊。(后者说,在这种情况下,无论你在“工作”这个词。) 您还可以注意到,可接受的未定义行为表现形式包括编译器拒绝编译包含未定义行为的代码。也就是说,如果需要,C 编译器完全有权以与 C++ 编译器在您的情况下的反应相同的方式对该代码作出反应。 毕竟,关于“为什么相同的代码在 C 中有效而在 C++ 中无效”的问题的提出令人惊讶。C 和 C++ 是非常不同的语言。因此,不清楚为什么“相同的代码在 C 中有效而在 C++ 中无效”这一事实引发了问题。 Andrej Levkovitch 2020-12-12T22:31:30Z2020-12-12T22:31:30Z 你写的是一个类型转换。一般来说,根本不清楚为什么需要这段代码?事实是,未引用的指针是内存位置的地址(通常是一个 8 字节的数字。当您执行 (int) b 时 - 您只需将其截断为 4 个字节。在 C + 中不允许这种类型转换+(以这种形式)。
在 C 和 C++ 中,指针到整数转换的结果值是实现定义的。然而:
在 C++ 中,从指针类型到整数类型的转换是根据
reinterpret_cast. 规范reinterpret_cast明确指出,只有当整数类型的大小足以存储结果值时,才允许从指针类型转换为整数类型。在您的情况下,显然,该类型int无法存储将类型指针转换int *为整数类型的结果。所以代码是错误的。在 C 中,将指针类型转换为整数类型不需要整数类型足够大。语言规范只说如果整数类型太小,行为是 undefined。
假设您的 C++ 和 C 平台具有相同的类型特征
int *,并且int类型int太窄而无法容纳给定转换的结果,那么从 C++ 的角度来看,您的程序是病态的。同时,它是正确的,但从 C 的角度来看表现得模糊。(后者说,在这种情况下,无论你在“工作”这个词。)您还可以注意到,可接受的未定义行为表现形式包括编译器拒绝编译包含未定义行为的代码。也就是说,如果需要,C 编译器完全有权以与 C++ 编译器在您的情况下的反应相同的方式对该代码作出反应。
毕竟,关于“为什么相同的代码在 C 中有效而在 C++ 中无效”的问题的提出令人惊讶。C 和 C++ 是非常不同的语言。因此,不清楚为什么“相同的代码在 C 中有效而在 C++ 中无效”这一事实引发了问题。
你写的是一个类型转换。一般来说,根本不清楚为什么需要这段代码?事实是,未引用的指针是内存位置的地址(通常是一个 8 字节的数字。当您执行 (int) b 时 - 您只需将其截断为 4 个字节。在 C + 中不允许这种类型转换+(以这种形式)。