Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的严格类型指针(假设)_C_Pointers - Fatal编程技术网

C中的严格类型指针(假设)

C中的严格类型指针(假设),c,pointers,C,Pointers,这是我今天考试的一个问题: 在C语言中,假设指针是严格类型的(即,指向int的指针不能用于指向char)。这会降低它的表达能力吗?如果没有,为什么以及如何补偿这一限制?如果是,如何进行?为了“平衡”C语言表达能力的丧失,您还需要添加哪些构造 其他一些细节: 通过降低表达能力,我认为这意味着:您将无法创建某些您可以更早创建的程序 严格类型的指针意味着您不能执行如下操作:intx=5;int*p=&x;字符*温度=(字符*)p 这包括(void*)转换 我也在下面列出了我的答案 (someTyp

这是我今天考试的一个问题:

在C语言中,假设指针是严格类型的(即,指向int的指针不能用于指向char)。这会降低它的表达能力吗?如果没有,为什么以及如何补偿这一限制?如果是,如何进行?为了“平衡”C语言表达能力的丧失,您还需要添加哪些构造

其他一些细节:

  • 通过降低表达能力,我认为这意味着:您将无法创建某些您可以更早创建的程序
  • 严格类型的指针意味着您不能执行如下操作:
    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:是的,但很难说他到底是什么意思。图灵完全性最接近于一般意义