C中的严格类型指针(假设)
这是我今天考试的一个问题: 在C语言中,假设指针是严格类型的(即,指向int的指针不能用于指向char)。这会降低它的表达能力吗?如果没有,为什么以及如何补偿这一限制?如果是,如何进行?为了“平衡”C语言表达能力的丧失,您还需要添加哪些构造 其他一些细节:C中的严格类型指针(假设),c,pointers,C,Pointers,这是我今天考试的一个问题: 在C语言中,假设指针是严格类型的(即,指向int的指针不能用于指向char)。这会降低它的表达能力吗?如果没有,为什么以及如何补偿这一限制?如果是,如何进行?为了“平衡”C语言表达能力的丧失,您还需要添加哪些构造 其他一些细节: 通过降低表达能力,我认为这意味着:您将无法创建某些您可以更早创建的程序 严格类型的指针意味着您不能执行如下操作:intx=5;int*p=&x;字符*温度=(字符*)p 这包括(void*)转换 我也在下面列出了我的答案 (someTyp
- 通过降低表达能力,我认为这意味着:您将无法创建某些您可以更早创建的程序
- 严格类型的指针意味着您不能执行如下操作:
intx=5;int*p=&x;字符*温度=(字符*)p代码>
- 这包括
转换(void*)
(someType *)((void *)somePtr)
这种构造允许您将任何指针转换为(someType*)。这是一个非常主观的问题。再加上我不知道“表达能力”是什么;) 仍然不能在指针类型之间转换是我头脑中的一个很大的限制。当使用Java将一个字符数组(例如来自网络套接字)映射到一个类时,似乎是非常烦人的。仅仅转换它并重新解释内存的能力是非常有用的,并且允许在处理随机内存块时进行显著的优化 你将如何克服这些限制?也许实现一个“cast”函数,或者仅仅是一个模板化的memcpy函数,可以重新解释内存,这将是优化的巨大奖励,对于像我这样的人来说,也是生产力的巨大奖励。它甚至可能是一个允许在字节流中包含某种类“id”的计划,以便您知道它可以被重新解释为一个特定的类
拥有这种功能的缺点是,它允许您以完全错误的方式解释数据。这可能会导致非常严重的错误。这是否意味着不再有
void*
?如果是这样,那么是的:C的表达能力将受到限制,因为malloc
将无法实现。你需要在C++的代码中添加一个新的、类型化的、免费的商店分配机制。
(或者,否:C仍然是图灵完整的。但我不认为这就是这里的意思。)
实际上,C甚至不是图灵完备的;请参阅下面的评论。这个问题类似于询问指针强制转换的有用/有效用途。以下是一些: 如果没有指针强制转换,则必须有多个版本的
memcpy
、memmove
、malloc
,因为这些都需要实现和使用指针转换。在malloc
的情况下,无法为用户定义的struct
分配内存
在稍有不同的类别中,您无法实现多态的qsort
(标准库提供的方法对void*
数组进行排序,并且可以有效地用于对各种指针数组进行排序)
至于什么样的特性可以重新获得表达能力,一个识别多态性的类型系统将是一个伟大的步骤,这样您就不必使用不安全的指针强制转换对其进行编码。这种类型的系统已经有很长一段时间了,如果你熟悉的话,它们遵循相同的思路。我不认为这会降低它的表达能力-你仍然能够编写图灵机器解释器,这意味着它是图灵完整的。例如,请参见此示例 如果你指的是用户便利性方面的表现力,那么它肯定会极大地限制C,因为内存分配机制(malloc&co.)必须改变 在C语言中,假设指针是 严格键入(即指向 int不能用于指向 字符)
提倡在C中使用严格的指针类型完全失去了意义,因为它只是汇编语言的一种可移植的速记。你应该能够自食其力,而一个优秀的开发人员也会聪明到不这样做。这实际上可能会增加C的表现力。C语言是为数不多的几种语言之一,任何给定的实现都被指定为不图灵完整。标准中的类型表示将所有类型指定为字符的重叠数组,这意味着程序可用的所有类型和总数据(所有可能的指针、所有可能的文件名和所有可能的文件偏移量等的空间)是有限的,因此,C的计算模型是一个有限状态机
如果您删除了指针表示为
char[sizeof(指针类型)]
的要求,那么正式指定的语言原则上可以处理无限量的数据,并且它将是图灵完整的。我想到了一种方法来绕过无法在各种类型之间进行类型转换的限制。你可以使用工会:
union alltypepointers
{
char* c,
short* s,
int* i,
float* f,
double* d,
...
};
所有指针的大小都相同,因此如果更改一个指针,可以将其作为任何其他类型读取。您也可以对这些指针进行算术运算:
int variable = 0x2345;
alltypepointers p;
p.i = &variable;
char *temp = p.c;
p.c++;
int newint=*p.i;
所以,你仍然可以做你之前能做的一切=>表达能力没有下降。这可能也会被禁止,否则这个问题就有点微不足道了。-1:这不是问题所在。OP询问如果不允许,会发生什么。不允许从(另一种类型*)转换为(某种类型*),但标准保证将(任意类型*)转换为(无效*)和(无效*)转换为(任何类型*)。但是OP询问如果在C语言中不可能进行任何类型转换会发生什么,而不管当前的标准是什么。图灵完整性不仅是衡量一种语言实际有用程度的无用指标,OP可能通过“表达性”来表示不同的意思。@delnan:是的,但很难说他到底是什么意思。图灵完全性最接近于一般意义