解除引用指向int的指针与在C语言中取消引用指向char的指针的指针相同吗?

时间:2011-10-19 02:08:39

标签: c pointers

让我们说在这种情况下,您希望在取消引用指针指针后存​​储地址。在功能上和以任何其他方式,将它取消引用为:

    *(int **)(/* some void ptr */) = // some other address;

    *(char **)(/* same void ptr */) = // some other address;

因为我知道当你取消引用一个指向int的指针,而只是一个指向char的指针时,它们是完全不同的东西!但是当处理指针指针时,中间有一个层,因为所有指针(在同一台机器上)的大小相同,我想知道这两种方法是否有任何区别

- >编辑:你甚至可以用unsigned ptr ptr,long ptr ptr和void ptr ptr替换它,并得到相同的东西吗?

3 个答案:

答案 0 :(得分:4)

您的假设“所有指针(在同一台机器上)的大小相同”是不正确的。对于您的特定机器来说可能确实如此,并且它很可能在您可能使用的任何机器上都是正确的,但C标准没有这样的保证,而且现实世界的机器并非如此。例如,在单词寻址机器上,int*可能表示为单词指针,但char*void*可能需要其他信息来指定它引用的单词中的哪个字节至。在某些体系结构上,函数指针与数据指针完全不同。

如果您发现自己正在构建指针类型,那么您的设计可能会出现问题,并且指针首先应该是正确的类型。

当然,这并非总是如此;有些情况下,这种低级访问是恰当和必要的,而C的一大优势在于它允许你做那种事情。

但如果没有更具体的例子,很难判断它是否合适。

具有不同类型的观点不仅仅是它们具有不同的大小或表示形式;关键是它们用于不同的目的。 int*指向int; char*指向char

您的示例之间的区别在于,一个引用int*个对象,另一个引用char*个对象。它们是不同的类型,并且它们不可互换,即使它们碰巧具有相同的大小和表示。你在赋值右侧注释掉的some other address必须是一些实际的表达式,它必须属于某种类型。

你想要完成什么?

答案 1 :(得分:2)

您可以将指针转换为您想要的任何其他类型。在大多数现代实现中,指针类型与任何其他指针类型具有相同的大小,无论数据指向什么。

但是,在类型正确性方面,C ++比C更严格,所以如果你盲目地将一种类型的指针分配给另一种类型,你可能会看到“无效转换”错误。

答案 2 :(得分:1)

是的,所有相同大小的指针大小,有趣的记忆模型放在一边。是的,你会得到同样的东西。