(int*) &var 是什么意思?

What does (int*) &var mean?

(int*) &i是什么意思?

  char i;
  int* p = (int*) &i;
  ...
  *p = 1234567892;
  ...

如果是* &i,我就明白了。但在这种情况下,这是一个“int”。

如果没有 (int*),gcc 会报错,因为指向胡萝卜的指针不是指向土豆的指针。

warning: initialization from incompatible pointer type [enabled by default]

因此,这个符号只是意味着好的,我知道我在这里做什么,把它当作一个指向不同类型的指针,即一个 int。

构造 (int *) &var,其中 var 是一个 char,接受指向 var 的指针,然后将其转换为另一个 [=62] 的指针=]类型(即int)。该程序随后将一个 int 值写入指针。由于指针实际上指向 charint 值不适合,这会触发 未定义的行为 ,这是“字面上任何东西(即您的计算机在物理上可以完成)可能会发生 -- 这个程序有问题。

编辑: 根据要求,一些标准解释了为什么这个程序有未定义的行为。以下所有章节引用均来自 N1570,这是最接近可在线免费访问的 C2011 官方文本的近似值。

作为序言,在阅读C标准的文本时,您需要知道“应”这个词具有特殊的意义。任何包含“shall”一词的句子都对程序或编译器和运行环境提出了硬性要求;您必须从上下文中找出哪个。程序有两种硬性要求。如果“约束”部分出现“应”语句,则要求编译器诊断违规情况(§5.1.1.3)(标准从不平淡地说程序必须拒绝,但这是硬错误和警告之间的通常界限)。如果“shall”语句出现在其他地方,则不需要编译器对其进行诊断,但违反要求的程序具有未定义的行为(§4p1,2)。有时文本会说“如果 X,则行为未定义”;结果没有区别。

首先,转换 (int *) &varchar * 转换为 int *,这是 §6.3.2.3p7 明确允许的 当且仅当 char 指针的值对于 int.

类型的对象正确 对齐

A pointer to an object type may be converted to a pointer to a different object type. If the resulting pointer is not correctly aligned for the referenced type, the behavior is undefined. Otherwise, when converted back again, the result shall compare equal to the original pointer.

显示的代码中没有任何内容可以确保 varint 适当对齐,因此程序可能已经触发了未定义的行为在这一点上,但让我们假设它 正确对齐。将 int * 类型的值保存到用该类型声明的变量中是没有问题的。接下来的操作是*p = integer_literal。这是对对象var的存储值的写访问,必须遵守§6.5p6,7:

中的规则
  1. The effective type of an object for an access to its stored value is the declared type of the object, if any. [... more text about what happens if the object has no declared type; not relevant here ...]

  2. An object shall have its stored value accessed only by an lvalue expression that has one of the following types:

    • a type compatible with the effective type of the object,
    • a qualified version of a type compatible with the effective type of the object,
    • a type that is the signed or unsigned type corresponding to the effective type of the object,
    • a type that is the signed or unsigned type corresponding to a qualified version of the effective type of the object,
    • an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union), or
    • a character type

对于像intchar这样的简单算术类型,兼容类型表示剥离后的相同类型typedef s.(确切的定义分布在 §§ 6.2.7、6.7.2、6.7.3 和 6.7.6 中。)对于此分析重要的只是 [=11= 的声明类型] 是 char,但是左值表达式 *p 的类型是 intintchar 不兼容,并且 int 不是字符类型。因此,此程序违反了用“应”一词声明的要求,该要求不在名为“约束”的部分内,并且其行为未定义。

注意最后一个要点的不对称性。 任何对象都可以通过具有字符类型的左值表达式访问其存储值,但是声明为具有字符类型的对象可能 not 被具有不兼容类型的左值表达式访问。是的,这意味着通过指向 int 严格来说是无效的。对于这种情况,许多编译器对其指针别名规则做了一个特殊的例外,以避免使该习惯用法无效。

但是,通过指向 int 的指针访问 单个 char 也是无效的,因为(在大多数系统上)int 更大比 char,所以你读取或写入超出对象末尾的字节。该标准不会费心将这种情况与数组情况区分开来,但它 无论如何都会 在你身上爆炸。

int * 是一种类型——具体来说它是指向 int 的指针。

(type)x 是类型转换。它说要将 x 重新解释或转换为该类型。对于指针类型,它总是意味着重新解释。

ichar 类型。所以 &ichar * 类型。将其转换为 int * 使其成为 int * 类型,以便可以将 p 分配给它。

当您随后通过 p 写入时,您将写入整个 int

&i : 表示取 i 的地址(一个 char*)

(int*)&i :将该指针转换为指向整数的指针(这是 bad/wrong 要做的,但你告诉编译器这样做它甚至不会发出警告)

int* p = (int*)&i; :声明将 i 的指针存储在 p 中(并强制转换它:编译器甚至不会抱怨)

*p = 1234567892; : 将这个数个字节的值写入 p 指向的 base 位置(虽然p认为它指向一个int,是指向char!)。其中一个字节将以 i 结尾,但其他字节将覆盖相邻 i 的字节。

&i给出变量i的地址。 (int *) 将该类型为 char * 的指针转换为指向 int.

的指针

语句 *p = 1234567892 然后具有未定义的行为,因为 p 实际上指向单个 char 的地址,但此表达式将该位置视为包含 int(不同类型)。在实践中,通常的结果是写入超过单个 char 的内存位置,这可能导致从数据中毒(例如更改其他变量的值)到立即程序崩溃的任何事情。

这意味着您的程序即将崩溃 BUS error

肯定是类型转换。 i 是字符变量,p 是指向整数的指针。 所以 p= (int *) &i 意味着 p 正在存储 i 的地址,它是 char 类型的,但是你已经对它进行了类型转换,所以这很好。现在 p 指向 i.

*p = 123455; // 此处您将值存储在 &i 和 123455。

当你打印这些值时

打印 (*p) // 123455

print (i) // 一些垃圾 -- 因为 i 是 char(1 字节)并且具有整数值(4 字节)。所以我将把它作为十进制值并相应地打印该值。

但是我们只说 *p = 65;

打印(*p) // 65

print(i) // A -- 因为 char i = 65 而 char 65 是 'A'

希望对您有所帮助。