首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法理解表达式*(uint32_t*)的作用

无法理解表达式*(uint32_t*)的作用
EN

Stack Overflow用户
提问于 2018-02-16 19:57:10
回答 3查看 173.4K关注 0票数 40

我无法理解*(uint32_t*)这个表达式的作用。

我已经把这个语句分解成一个例子,它声明了各个部分,这样我就可以尝试解释每个部分所做的事情。

代码语言:javascript
复制
  uint32_t* ptr;
  uint32_t num
  *(uint32_t*)(ptr + num); // <-- what does this do?

我不理解示例中的最后一点,当表达式*(uint32_t*)(ptr + num);在运行时执行时会发生什么?

EN

回答 3

Stack Overflow用户

发布于 2018-11-06 18:08:18

uint32_t是在stdint.h中定义的,因此可能需要包含它

代码语言:javascript
复制
#include <stdint.h>

这个标头 to be an unsigned integer type taking exactly 32 bits

票数 13
EN

Stack Overflow用户

发布于 2018-02-16 20:09:35

这真的没什么用。让我举一个不同的例子:

代码语言:javascript
复制
uint32_t data;
void *pointer = &data;
*(uint32_t *)pointer = 5;

首先,void*的意思是“泛型”指针。它可以指向任何类型的对象。

现在,(uint32_t *)的意思是“将pointer解释为指向具有uint32_t类型的对象的指针。

表达式的其余部分简单地表示“在此指针存储的位置存储5”。

如果您想知道uint32_t是什么,那就是一个没有符号的整数,确切地说是32位。pointer + numpointer[5]的入口是一样的。

票数 3
EN

Stack Overflow用户

发布于 2021-02-22 11:57:03

这种类型的表达式通常用于双关语。如果您不熟悉类型双关语,那么主要的想法是绕过类型系统,这样您就可以将某物视为与实际类型不同的类型(即将int a视为double)。

类型双关的主要思想是将指向当前变量的指针转换为另一种类型,将其转换为该类型的指针,然后取消引用,这就是您所指的常用的强制转换和取消引用( *(uint32_t *) =强制转换为无符号32位int指针,然后取消引用)。

正如其他人所指出的,您的代码“什么也不做”,因为您正在将int双关为int,这没有任何效果。如果你想把一个int变成双关.

代码语言:javascript
复制
uint32_t num=5;
double& myvar=*(double*) &num;

现在,您可以通过num通过myvarnum的内存作为双重操作,即使num仍然是Int。这是一个可怕的想法,只是作为一个玩具的例子使用双关语。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48833976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档