c - 有人可以解释一下 C 中的类型转换吗?
问题描述
我已经关注了一段代码。我想了解的是,为什么我们要使用*(uint8 *)
而不是 just进行类型转换*(uint8_t)
?
- 不
*(uint8_t *)value
读为:value
是 ptr 到uint8_t
ptr 和 - 不
*(uint8_t)value
读作:value
是 ptr 到uint8_t
我只是对这两个有点困惑。任何解释都非常感谢。
uint8_t read_8_function(uint8_t *addr);
uint16_t read_16_function(uint16_t *addr);
uint32_t read_32_function(uint32_t *addr);
int some_function(uint32_t size, uint32_t *value){
uintptr_t some_addr = (uintptr_t *)0xaaaa5555;
switch(size) {
case 1:
*(uint8_t *)value = read_8_function(some_addr);
case 2:
*(uint16_t *)value = read_16_function(some_addr);
case 4:
*value = read_32_function(some_addr);
}
return 0;
}
解决方案
value
是指向 的指针uint32_t
。强制转换将其转换为指向不同类型的指针;(uint8_t *)value
将其转换为指向uint8_t
. 然后取消引用,用于分配给该地址的 8 字节字段。
(uint8_t)value
会将指针转换为 8 位整数。然后在*
此之前将尝试使用该整数作为分配地址,这是无效的;你不能取消引用一个整数。此外,指针大于 8 位(在大多数现代 CPU 上它们是 32 位或 64 位),因此将指针转换为uint8_t
会丢弃大部分指针的值。
推荐阅读
- winappdriver - 如何使用 WinAppDriver 在 Modal 窗口的 Modal 窗口中定位元素
- java - 安装程序后打开程序时出现主要 Claas 错误
- c# - .NET Core 的双重麻烦:0.0 与 -0.0
- c++ - 我想打印一个和零的模式
- java - 使用来自 ByteBuffer 的消息摘要计算校验和
- php - LdapRecord 没有从 Laravel-permissions 获得任何权限
- react-native - react-native,Android Freshchat isFreshchatNotification 未处理 Firebase 远程消息
- java - spring boot 2.4.0 或更高版本中的多文档属性和配置文件
- jmeter - 如何处理 JMeter 主从问题
- html - 如何在 1 个单个 div 中生成 *ngFor 循环项,而不是每个项目周围都有一个 div 容器