我对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 **类型.我对吗 ?
如果是这样,我想知道为什么这两种类型在第二种情况下没有相同的表示?我的意思是,int和int const具有相同的表示形式,同义词用于int *和int const *,那么int **和int const **的问题是什么?
最佳答案 正如Bart van Ingen Schenau所说,我认为标准化委员会希望尽可能少地限制指针的表示.从编译器的角度来看,为int *和int const *设置一个独特的表示将是有用的,因为常量可以放在更大或更小的内存中,因此可以使用更小的指针指向更小的内存.但是,这意味着printf的%s格式说明符应该有两个版本,一个用于常量字符串,另一个用于非常量字符串.这会打破很多遗留代码,我的猜测是标准化委员会缺乏将这一点强加于社区的勇气.也许这是理所当然的.由于没有令人信服的理由来强制执行int **和int const **的相同表示,因此他们就这样做了.然而,对于这些指针使用不同的表示几乎没有用,除了可能对于一些极端情况应用.
他们也可能已经决定只有char *和char const *应该具有相同的表示,只是为了保存%s,但也许还有一些其他接口需要相等的指针指向其他基本类型.
类似地,在一些系统上,希望在全局存储器中具有不同的指针表示,堆栈上的某些东西和堆中的某些东西.然而,在C中可以使用指针,使得它可以包含这样的指针(再次你可以想到varargs),因此需要至少具有可以表示所有指针的指针表示.
在C内存空间的Embedded-C扩展中,已经引入了明确允许程序员从不同的数据总线获取数据,而不需要可以代表它们的指针类型.这样的存储空间也可用于指定常量,堆等的专用存储器.从而允许更有效的指针表示.
我的一位同事也提到K& R原型,或更好的原型,仍然允许.在这种情况下,编译器无法检测参数声明和使用之间的表示差异.毫无疑问,这将导致遗留软件中出现许多未检测到的问题.这些问题可以通过要求在参数传递(包括变量)上使用公共表示来解决,例如,对于浮点数在varags中加倍,但这也会损害不同表示的预期效率.