这条线在C99中意味着什么?

时间:2017-01-21 10:51:53

标签: c c99

static int* p= (int*)(&foo);

我只知道p指向代码段中的内存。 但我不知道这一行到底发生了什么 我想也许它是指向函数的指针,但指向函数的格式是:

returnType (*pointerName) (params,...);
pointerName = &someFunc; // or pointerName=someFunc;

2 个答案:

答案 0 :(得分:1)

您获取foo的地址并将其转换为int的指针。

如果foop的类型不同,编译器可能会发出有关类型不匹配的警告。演员要压制那个警告。

例如,请考虑以下代码,该代码会导致编译器发出警告(initialization from incompatible pointer type):

float foo = 42;
int *p = &foo;

此处foofloat,而p指向int。显然 - 不同的类型。

类型转换使编译器将一个变量视为不同类型。通过在括号中添加新类型名称来进行类型转换。在这里,我们将指向float的指针视为指向int的指针,警告将不复存在:

float foo = 5;
int *p = (int*)(&foo);

你也可以省略一对括号,它的意思相同:

float foo = 5;
int *p = (int*)&foo;

如果foo是函数,则问题相同。我们有一个指向赋值右侧函数的指针和一个指向左侧int的指针。将添加一个强制转换,以使指向函数的指针被视为int的地址。

答案 1 :(得分:0)

指向对象的类型的指针(即不是空*而不是a 指向函数的指针)不能存储到指向任何其他类型的指针 没有强制转换的对象,除了在类型相同的少数情况下 除了资格赛。合规编制者需要签发 如果该规则被破坏,则进行诊断。

除此之外,标准允许编译器解释强制转换的代码 无意义的指针除非代码助手受到某些限制 对于名义上来说,这样的书写使这些演员基本无用 促进优化的目的。什么时候写规则,大多数 编译器可能会做大约一半的优化 根据规则被允许,但仍然会明智地处理指针转换 因为这样做可能会花费理论上可能的5% 优化。然而,今天,编译器编写者更加时尚 找出所有允许优化的情况 标准而不考虑它们是否有意义。

像gcc这样的编译器有一个选项-fno-strict-aliasing来阻止它 一种优化,无论是在哪种情况下都会带来巨大的好处 风险很小,以及几乎肯定会破裂的情况 代码,不太可能提供任何真正的好处。如果它们会有所帮助 有一个选项可以阻止后者,但我不知道一个。因此,我的 建议是除非人们想要在非常有限的子集中编程 丹尼斯里奇的语言,我建议瞄准-fno-strict-aliasing 方言。