指针表示

Tau*_*rre 5 c standards pointers representation

我对 C 中的指针表示有疑问。如果我正确理解了 C11 标准的这一段:

\n\n

C11 (N1570),\xc2\xa7 6.2.5.28,类型,第 14 页。36

\n\n
\n

类似地,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求。

\n
\n\n

我推断类型int *int const *具有相同的表示形式,但类型int **和不具有相同的表示形式int const **则不同。我对吗 ?

\n\n

如果是这样,我想知道为什么这两种类型在第二种情况下没有相同的表示?我的意思是,intint const具有相同的表示,同上int *和,那么和int const *是怎么回事int **int const **

\n

Bry*_*ier 1

正如 Bart van Ingen Schenau 也指出的那样,我认为标准化委员会希望对指针的表示施加尽可能少的限制。从编译器的角度来看,为int *和提供不同的表示会很有用int const *,因为常量可以放置在更大或更小的内存中,因此可以使用更小的指针来指向更小的内存。然而,这意味着 的%s格式说明符printf应该有两种版本,一种用于常量字符串,另一种用于非常量字符串。这会破坏很多遗留代码,我的猜测是标准化委员会缺乏将其强制执行到社区的勇气。也许确实如此。由于没有令人信服的理由对int **和强制执行相同的表示int const **,因此他们就这样保留了。然而,对这些指针使用不同的表示形式几乎没有用,除了某些极端情况应用程序。

他们可能还决定only char *char const *应该具有相同的表示形式,只是为了保存%s,但也许还有一些其他接口也要求指向其他基元类型的指针相等。

类似地,在某些系统上,对于全局内存中的某些内容、堆栈中的某些内容和堆中的某些内容,希望有不同的指针表示。然而,在 C 中可以以这样的方式使用指针,即它可以包含这样的指针(同样你可以想到可变参数),因此至少需要有一个可以表示所有这些指针的指针表示形式。

在嵌入式 C 中,引入了 C 内存空间扩展,以明确允许程序员从不同的数据总线获取数据,而不需要可以代表所有数据的指针类型。这样的内存空间还可以用于指定常量、堆等的专用内存。从而允许更有效的指针表示。

我的一位同事也提到,K&R 原型,或者最好是没有原型,仍然是允许的。在这种情况下,编译器无法检测参数声明和使用之间的表示差异。这无疑会导致遗留软件中出现许多未被发现的问题。这些问题本来可以通过要求在参数传递(包括可变参数)上使用通用表示来解决,例如在可变参数中为floatto所做的double,但这也会损害不同表示的预期效率。