我无法理解*(uint32_t*)这个表达式的作用。
我已经把这个语句分解成一个例子,它声明了各个部分,这样我就可以尝试解释每个部分所做的事情。
uint32_t* ptr;
uint32_t num
*(uint32_t*)(ptr + num); // <-- what does this do?我不理解示例中的最后一点,当表达式*(uint32_t*)(ptr + num);在运行时执行时会发生什么?
发布于 2018-11-06 18:08:18
uint32_t是在stdint.h中定义的,因此可能需要包含它
#include <stdint.h>发布于 2018-02-16 20:09:35
这真的没什么用。让我举一个不同的例子:
uint32_t data;
void *pointer = &data;
*(uint32_t *)pointer = 5;首先,void*的意思是“泛型”指针。它可以指向任何类型的对象。
现在,(uint32_t *)的意思是“将pointer解释为指向具有uint32_t类型的对象的指针。
表达式的其余部分简单地表示“在此指针存储的位置存储5”。
如果您想知道uint32_t是什么,那就是一个没有符号的整数,确切地说是32位。pointer + num和pointer[5]的入口是一样的。
发布于 2021-02-22 11:57:03
这种类型的表达式通常用于双关语。如果您不熟悉类型双关语,那么主要的想法是绕过类型系统,这样您就可以将某物视为与实际类型不同的类型(即将int a视为double)。
类型双关的主要思想是将指向当前变量的指针转换为另一种类型,将其转换为该类型的指针,然后取消引用,这就是您所指的常用的强制转换和取消引用( *(uint32_t *) =强制转换为无符号32位int指针,然后取消引用)。
正如其他人所指出的,您的代码“什么也不做”,因为您正在将int双关为int,这没有任何效果。如果你想把一个int变成双关.
uint32_t num=5;
double& myvar=*(double*) #现在,您可以通过num通过myvar将num的内存作为双重操作,即使num仍然是Int。这是一个可怕的想法,只是作为一个玩具的例子使用双关语。
https://stackoverflow.com/questions/48833976
复制相似问题