gpt4 book ai didi

c - 指针表示

转载 作者:太空狗 更新时间:2023-10-29 15:38:50 25 4
gpt4 key购买 nike

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

C11 (N1570),§ 6.2.5.28,类型,p. 36

Similarly, pointers to qualified or unqualified versions of compatible types shall have the same representation and alignment requirements.

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

如果是这样,我想知道为什么这两种类型在第二种情况下没有相同的表示形式?我的意思是,intint const 具有相同的表示,int *int const * 同上,所以int **int const ** 有什么问题?

最佳答案

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

他们可能还决定只有 char *char const * 应该有相同的表示,只是为了节省 % s,但也许还有一些其他接口(interface)也要求指向其他基本类型的指针相等。

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

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

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

关于c - 指针表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16677335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com