什么是*(uint32_t *)

时间:2018-02-16 19:57:10

标签: c uint32-t

我很难理解*(uint32_t*)

我说我有

uint32_t* ptr;
uint32_t num
*(uint32_t*)(ptr + num); //what does this do? does it 

4 个答案:

答案 0 :(得分:15)

uint32_t是一个保证32位的数字类型,值是无符号的, 意思是值的范围从0到2 32 - 1。

uint32_t* ptr;

声明类型为uint32_t的指针,但指针未初始化,即 意味着指针不指向任何地方。试图访问 通过该指针的内存将导致未定义的行为和您的程序 可能会崩溃。

uint32_t num;

只是uint32_t类型的变量。

*(uint32_t*)(ptr + num);

ptr + num返回一个新指针。它被称为指针算术,它是 像常规算术一样只有编译器将类型的大小放入其中 考虑。将ptr + num视为基于原始内存的内存地址 ptr指针加上num uint32_t个对象的字节数。

(uint32_t*) x是一个演员,这告诉编译器它应该对待 表达式x就好像它是unit32_t一样。在这种情况下,它甚至不需要 因为ptr + num已经是uint32_t*

开头的*是用于访问的解除引用运算符 记忆通过一个指针。整个表达式相当于

ptr[num];

现在因为没有初始化这些变量,结果将是垃圾。 但是,如果你这样初始化它们:

uint32_t arr[] = { 1, 3, 5, 7, 9 };
uint32_t *ptr = arr;
uint32_t num = 2;

printf("%u\n", *(ptr + num));

这将打印5,因为ptr[2]是5。

答案 1 :(得分:3)

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

#include <stdint.h>

答案 2 :(得分:1)

这并没有真正做任何事情。让我举个不同的例子:

uint32_t data;
void *pointer = &data;
*(uint32_t *)pointer = 5;

首先,void*表示&#34; generic&#34;指针。它可以指向任何类型的对象。

现在,(uint32_t *)表示&#34;将pointer解释为指向类型为uint32_t的对象的指针。

表达式的其余部分仅表示&#34;将5存储在此指针存储的位置&#34;。

如果你想知道uint32_t是什么,那就是一个正好是32位的无符号整数。 pointer + numpointer[5]的地址相同。

答案 3 :(得分:0)

这种类型的表达通常用于类型双关。如果您不熟悉类型双关,主要思想是绕过类型系统,以便您可以将某些东西视为与实际不同的类型(即,将 int a 视为 double)

类型双关背后的主要思想是您获取一个指向当前变量的指针,然后通过将其转换为该类型的指针然后取消引用来将其转换为不同的类型,因此您所指的常用转换和取消引用to ( *(uint32_t *) = 转换为无符号 32 位 int 指针,然后取消引用)。

正如其他人指出的那样,您的代码“什么都不做”,因为您将 int 转换为 int,这没有任何效果。但是,如果您想将 int 转换为 double ......

uint32_t num=5;
double& myvar=*(double*) &num;

现在您可以通过 nummyvar 的内存作为双精度操作,即使 num 仍然是一个 Int。这是一个糟糕的想法,只是作为使用双关语的一个玩具示例。