什么是*(uint32_t*)

Hoa*_*a.N 8 c uint32-t

我很难理解*(uint32_t*).

让我说我有

uint32_t* ptr;
uint32_t num
*(uint32_t*)(ptr + num); //what does this do? does it 
Run Code Online (Sandbox Code Playgroud)

Pab*_*blo 21

uint32_t是一个保证32位的数字类型,该值是无符号的,这意味着值的范围从0到2 32 - 1.

这个

uint32_t* ptr;
Run Code Online (Sandbox Code Playgroud)

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

这个

uint32_t num;
Run Code Online (Sandbox Code Playgroud)

只是一个类型的变量uint32_t.

这个

*(uint32_t*)(ptr + num);
Run Code Online (Sandbox Code Playgroud)

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

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

*开头是用于访问所述存储器通过量的指针解除引用运算符.整个表达相当于

ptr[num];
Run Code Online (Sandbox Code Playgroud)

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

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

printf("%u\n", *(ptr + num));
Run Code Online (Sandbox Code Playgroud)

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

  • 除了 printf 说明符,OK。`"%" PRIu32` 更好。`"%u"` 匹配 `unsigned`。 (2认同)

use*_*610 10

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

#include <stdint.h>
Run Code Online (Sandbox Code Playgroud)

  • 此评论没有回答“什么是`*(uint32_t*)`?”这个问题。 (7认同)
  • 而是将其添加为评论 (2认同)