如何解决为什么我可以将多个指针传递给单个指针参数?
我刚刚发现我可以将双指针传递给需要单个指针作为参数的函数。
void func(void *p) {}
void **p;
func(p);
我什至可以做到这一点:
void memcpy(void *dst,void *src) {}
void ****dst,*********src;
memcpy(dst,src);
似乎发生了隐式转换。
但是,这种转换的规则是什么?标准怎么说?
解决方法
调用函数时,则为(6.5.2.2):
...参数会隐式转换(就像通过赋值一样)为 相应的参数
因此,为了查看是否允许我们将某些内容传递给函数,我们需要检查分配规则。在简单分配规则中,列出了所有有效的表单,包括该表单(6.5.16.1,强调我的表单):
- 左操作数具有原子,合格或不合格的指针类型,并且(考虑到左操作数在左值转换后将具有的类型)一个操作数是指向对象类型的指针,另一个是指向对象类型的指针
void
的合格或不合格版本,并且左侧指向的类型具有右侧指向的类型的所有限定符;
这意味着我们可以将对象指针类型隐式分配给void*
,反之亦然。当我们将参数传递给函数时,也是一样。
这就是为什么您没有得到任何诊断消息的原因,void*
是一种特殊情况,它是一种通用对象指针类型,可以与任何其他对象指针类型一起使用。请注意,我使用术语对象指针,因为您不能将void*
与函数指针混合使用。
在6.3.2.3中指定了如何进行实际转换:
指向
void
的指针可以与任何对象类型的指针进行转换。指向任何对象类型的指针都可以转换为指向void
的指针,然后再次返回。结果应等于原始指针。
这些特殊规则仅适用于void*
。它们不会“递归”应用于void**
。但是void**
仍然是对象指针类型,因此您可以将其分配给void*
等。但是您不能从例如double**
到void**
。
但是请注意,必须遵守上述6.5.16.1中的限定符(const
,volatile
)。我们可以将非合格类型分配给合格类型,但不能相反。 (另请参阅6.3.2.3/2)
特别是from classes.orders import Order
(可选(常量/易失性))。
只要指针不会丢失最上面的const / volatile,就可以将其转换为任何指针。
这种转换的规则是什么?标准怎么说?
,指向void的指针可以转换为任何对象类型的指针,也可以将其转换为任何对象类型的指针。指向任何对象类型的指针都可以转换为void指针并再次返回;结果应等于原始指针。
void* ptr
是带有地址的指针。
void** ptr
还是带有地址的指针。
因此,您只是传递了一个可以存储在任何指针中的地址。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。