C# 为什么C语言规范没有提到指针类型?

C# 为什么C语言规范没有提到指针类型?,c#,pointers,types,C#,Pointers,Types,当我阅读C语言规范时,我注意到中没有关于指针类型的内容。规范中提到了指针类型,但我只是想知道为什么他们在类型部分没有提到指针?C绝对支持指针类型,那么在类型部分不提及它们是否有技术原因呢?我的猜测是不知道这一点的,因为指针类型仅在不安全的上下文中可用,这在您链接到的MSDN页面中有提及 内置类型的文档可能是最常见、最通用的,不包括C语言中很少需要的不安全场景。不过,我只是猜测,可能还有另一个原因。指针类型不是CLR理解的特殊类型,它只是指向另一个具体类型的指针,或者在void*的情况下至少是一个

当我阅读C语言规范时,我注意到中没有关于指针类型的内容。规范中提到了指针类型,但我只是想知道为什么他们在类型部分没有提到指针?C绝对支持指针类型,那么在类型部分不提及它们是否有技术原因呢?

我的猜测是不知道这一点的,因为指针类型仅在不安全的上下文中可用,这在您链接到的MSDN页面中有提及


内置类型的文档可能是最常见、最通用的,不包括C语言中很少需要的不安全场景。不过,我只是猜测,可能还有另一个原因。

指针类型不是CLR理解的特殊类型,它只是指向另一个具体类型的指针,或者在void*的情况下至少是一个内存地址

除了CLR给了你更多的控制权,要求你的代码是可信的,并管理它自己的安全性;字符串和字符串*之间没有区别;在间接寻址之后,它们都是System.String

指针类型不是类型,而是指向类型的指针;只是CLR放弃了所有的安全检查,并假设您知道自己在做什么

我想值得注意的是,任何作为方法参数“按引用”ie类传递的东西都是.Net中的指针;它们只是受CLR保护。

好的,从以下开始:

第一个链接指向2003年的规范。有点旧了。 第二个链接不是规范,而是编程指南? 指针在第4节中提到。类型部分。在本章导言中:

第三类类型指针仅在不安全代码中可用。第18.2节对此作了进一步讨论


指针类型的规则与值和引用类型的规则大不相同,我想这就是为什么有整章标题为18的原因。不安全代码。

可能是因为C中的指针未经CLR验证,文档中也提到了这一点,即C默认情况下不支持指针算法

对我来说,在文档中分别保存托管和非托管规范更有意义

您可能已经阅读了给定的链接,但当您阅读此页面时,它仍然更有意义。

因此,您已经找到了要查找的文档,但您正在询问社区为什么要以这种方式组织规范?我不确定你真正的问题是什么,不管怎样,这样的问题都不适合这么做。如果我冒险猜测,这可能是因为它们不安全,应该不惜一切代价避免它们的使用。@Ginosaji我强烈不同意这一点-指针类型肯定有其位置-它们很少被需要,但“不惜一切代价避免它们”是错误的。当在正确的情况下使用时,它们可以产生巨大的效果。任何工具都可能被误用,就像指针一样。@xxbbcc:在极少数情况下,不安全的代码可能是可取的,甚至是必要的,这就是为什么我加入了几乎是免责声明的原因。@Ginosaji你说得对,你确实这么说了。:实际上,每当你在C中通过引用传递某个东西时,不管你是否知道,你都在使用指针。@RussC我知道-我用C做了很多不安全的编码。酷:但在C中使用指针并不需要做不安全的编码,你只是经常不把你正在使用的东西当作指针。我想我应该指出两者的区别,因为这是新的C开发人员不总是能得到的东西。@RussC-啊,好吧,我完全忽略了这一点谢谢你提到这一点,你说得对。@RussC,你使用的是引用,不是指针。但你也遇到了同样的基本问题——它们是一种类型,就像它们是一种引用对象的类型一样,但它们不是一种“类型”,因为它们不是f.ex继承System.Object的对象。事实上,它们不继承System.Object并不能证明它们不是一种类型。您仍然可以执行typeofitptr,您将得到Type实例。它们只是不同类型的类别,如规范中所述。与ECMA CLI规范不同:指针类型、函数指针类型和值类型不是对象类型。I.8.9指针不是可表示为System.types的类型。它们没有MethodTable,它们是根据指向的对象键入的,但指针类型的值不是对象。。。给定指针类型的值,无法确定其确切类型。I.8.9.2很有趣。但是为什么link中的规范不是最新的,它在谷歌中是第一位的。我没有选择2003@Selman22我不知道。你应该责怪谷歌将过时的数据作为最佳搜索结果,而不是MSDN显示历史数据。是的,有人仍在使用C2.0。