c - 来自 Ua_Variant 的 C 类型转换
问题描述
我试图了解类型转换在以下代码中的作用
UA_Variant Variant;
Int32_t Variable;
variable = *(int32_t *) Variant.data;
printf("%d", variable);
这是 UA_Variant 的结构
typedef struct
{
const UA_DataType *type; /* The data type description */
UA_VariantStorageType storageType;
size_t arrayLength; /* The number of elements in the data array */
void *data; /* Points to the scalar or array data */
size_t arrayDimensionsSize; /* The number of dimensions */
UA_UInt32 *arrayDimensions; /* The length of each dimension */
} UA_Variant;
这条线发生了什么
variable = *(int32_t *) Variant.data;
是否将 Variant 中的数据类型转换为 int32_t 然后将其指针放入变量中,如果是这样,为什么我可以打印出存储在变量中的值?
解决方案
让我们分多个步骤解压缩此语句:*(int32_t *) Variant.data
首先,根据结构,我们有Variant.data
哪一个。这意味着它只是一个包含内存地址的数字。void*
UA_Variant
然后,与(int32_t *)
您一起将其void*
转换为int32_t*
. 指向的数据Variant.data
将被解释为指向数据类型的指针int32_t
。我坚持解释不铸造。
最后,您使用操作员取消引用它*
。因此,变量包含被解释为有符号 32 位值variable
的指向的数据。Variant.data
这意味着,如果 指向的数据Variant.data
是其他数据类型,例如float
s,则变量中的结果值看起来是随机的,并且取决于未定义的行为。这是因为不同的平台以不同的方式实现每种数据类型。
由于此变量是一个值,因此您可以像打印任何其他变量一样打印它。
推荐阅读
- java - 模拟 RestTemplate.exchange() 给出的 URI 不是绝对的例外
- r - R数据框中的条件填充值
- php - 如何找到最近创建的用户 - Laravel
- php - 如何使用 php pdo 在 mysql 中使用外键约束从数据库中删除数据
- javascript - req.headers['x-access-token'] 为空
- c# - 单个 LINQ 查询中的多个求和触发多个 SQL 查询
- python - 获取参数 None 的类型无效
- python-3.x - Python中使用timeit的for循环和while循环性能差异
- git - 将本地分支从一个仓库移植到另一个仓库
- node.js - 如何将 udp 数据从容器内的服务器发送到远程服务器?