让我们说在这种情况下,您希望在取消引用指针指针后存储地址。在功能上和以任何其他方式,将它取消引用为:
*(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替换它,并得到相同的东西吗?
答案 0 :(得分:4)
您的假设“所有指针(在同一台机器上)的大小相同”是不正确的。对于您的特定机器来说可能确实如此,并且它很可能在您可能使用的任何机器上都是正确的,但C标准没有这样的保证,而且现实世界的机器并非如此。例如,在单词寻址机器上,int*
可能表示为单词指针,但char*
或void*
可能需要其他信息来指定它引用的单词中的哪个字节至。在某些体系结构上,函数指针与数据指针完全不同。
如果您发现自己正在构建指针类型,那么您的设计可能会出现问题,并且指针首先应该是正确的类型。
当然,这并非总是如此;有些情况下,这种低级访问是恰当和必要的,而C的一大优势在于它允许你做那种事情。
但如果没有更具体的例子,很难判断它是否合适。
具有不同类型的观点不仅仅是它们具有不同的大小或表示形式;关键是它们用于不同的目的。 int*
指向int
; char*
指向char
。
您的示例之间的区别在于,一个引用int*
个对象,另一个引用char*
个对象。它们是不同的类型,并且它们不可互换,即使它们碰巧具有相同的大小和表示。你在赋值右侧注释掉的some other address
必须是一些实际的表达式,它必须属于某种类型。
你想要完成什么?
答案 1 :(得分:2)
您可以将指针转换为您想要的任何其他类型。在大多数现代实现中,指针类型与任何其他指针类型具有相同的大小,无论数据指向什么。
但是,在类型正确性方面,C ++比C更严格,所以如果你盲目地将一种类型的指针分配给另一种类型,你可能会看到“无效转换”错误。
答案 2 :(得分:1)
是的,所有相同大小的指针大小,有趣的记忆模型放在一边。是的,你会得到同样的东西。