Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这条线在C99中是什么意思?_C_C99 - Fatal编程技术网

这条线在C99中是什么意思?

这条线在C99中是什么意思?,c,c99,C,C99,我只知道p指向代码段中的内存。 但我不知道这一行到底发生了什么。 我认为它可能是指向函数的指针,但指向函数的格式是: static int* p= (int*)(&foo); 您获取foo的地址,并将其转换为指向int的指针 如果foo和p属于不同的类型,编译器可能会发出类型不匹配的警告。演员们要压制这一警告 例如,考虑下面的代码,这会导致编译器发出警告(初始化从不兼容的指针类型< /代码>): 这里的foo是一个float,而p指向一个int。显然,不同的类型 类型转换使编译器将一个

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

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

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

如果
foo
p
属于不同的类型,编译器可能会发出类型不匹配的警告。演员们要压制这一警告

例如,考虑下面的代码,这会导致编译器发出警告(<代码>初始化从不兼容的指针类型< /代码>):

这里的
foo
是一个
float
,而
p
指向一个
int
。显然,不同的类型

类型转换使编译器将一个变量视为不同的类型。您可以通过将新的类型名称放在括号中进行类型转换。在这里,我们将使指向
float
的指针被视为指向
int
的指针,并且警告不再是:

float foo = 42;
int *p = &foo;
你也可以省略一对括号,意思是一样的:

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

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

的地址,即指向对象(即非void*且非 指向函数的指针)不能存储为指向任何其他类型函数的指针 对象,除非在少数情况下类型相同 除了资格赛。要求合格的编译器发布 如果该规则被打破,则进行诊断

除此之外,该标准还允许编译器解释强制转换的代码 除非代码有一些限制,否则指针是无意义的 正如书面所述,这使得这些铸型对于名义上的 促进优化的目的。在制定规则时,大多数人 编译器可能会进行大约一半的优化 在规则下是允许的,但仍会明智地处理指针强制转换 因为这样做可能会花费理论上可能的5% 优化。然而,今天,它对于编译器编写人员来说更为流行 找出客户允许进行优化的所有情况 不考虑是否合理的标准

像gcc这样的编译器有一个选项-fno严格别名来阻止这一点 这是一种优化,无论在哪些情况下,它都会带来巨大的好处,并且 风险很小,在几乎肯定会破裂的情况下也是如此 代码,不太可能提供任何真正的好处。如果他们 我可以选择只阻止后者,但我不知道有一个。因此,我的 建议是,除非您希望在非常有限的子集中编程 对于丹尼斯·里奇的语言,我建议针对-fno严格的别名
方言。

函数类型是指返回变量的类型吗?这里没有函数!我已经扩展了我的答案,所以现在可能更清楚了。但是考虑<代码> fo是一个函数而不是变量。现在怎么可能呢?我进一步扩展了我的答案。问题再次是类型不匹配。请参阅
float foo = 5;
int *p = (int*)(&foo);
float foo = 5;
int *p = (int*)&foo;