什么是 *(uint32_t*)?
What is *(uint32_t*)?
我很难理解*(uint32_t*)
。
假设我有:
uint32_t* ptr;
uint32_t num
*(uint32_t*)(ptr + num); // What does this do? Does it
uint32_t
是保证32位的数值类型。该值是无符号的,这意味着值的范围从 0 到 232 - 1.
这个
uint32_t* ptr;
声明了一个uint32_t*
类型的指针,但指针未初始化,即
也就是说,指针没有特别指向任何地方。尝试通过该指针访问内存将导致未定义的行为,您的程序可能会崩溃。
这个
uint32_t num;
只是一个uint32_t
类型的变量。
这个
*(uint32_t*)(ptr + num);
ptr + num
returns你一个新的指针。它被称为指针算术。这就像常规算术,只是编译器将类型的大小放入
考虑。将 ptr + num
视为基于原始 ptr
指针的内存地址加上 num
uint32_t
对象的字节数。
(uint32_t*) x
是演员表。这告诉编译器它应该将表达式 x
视为 uint32_t*
。在这种情况下,甚至不需要,
因为 ptr + num
已经是 uint32_t*
.
开头的*
是解引用操作符,用于通过指针访问内存。整个表达式相当于
ptr[num];
现在,因为 none 个变量被初始化,结果将是垃圾。
然而,如果你像这样初始化它们:
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。
这并没有真正做任何事情。让我给你一个不同的例子:
uint32_t data;
void *pointer = &data;
*(uint32_t *)pointer = 5;
首先,void*
表示"generic"指针。它可以指向任何类型的对象。
现在,(uint32_t *)
表示“将 pointer
解释为指向类型为 uint32_t
的对象的指针。
表达式的其余部分仅表示 "store 5 at the location stored by this pointer"。
如果您想知道 uint32_t
是什么,那是一个恰好 32 位的无符号整数。 pointer + num
与 pointer[5]
.
的地址相同
uint32_t
在 stdint.h
中定义,因此可能需要包含它
#include <stdint.h>
这个headershall define uint32_t
to be an unsigned integer type taking exactly 32 bits.
这种表达方式通常用于双关语。如果您不熟悉类型双关,主要思想是绕过类型系统,以便您可以将某些东西视为与实际不同的类型(即将 int a 视为 double)
类型双关背后的主要思想是你获取一个指向当前变量的指针,然后通过将它转换为该类型的指针然后取消引用它来将它转换为不同的类型,因此常用的转换和取消引用你指的是( *(uint32_t *)
= 转换为无符号 32 位 int 指针,然后取消引用)。
正如其他人指出的那样,您的代码“什么都不做”,因为您将一个 int 转换为一个 int,这没有任何效果。但是,如果您想将一个 int 双关语转换为 double...
uint32_t num=5;
double& myvar=*(double*) #
现在您可以通过 myvar
将 num
的内存作为 double 进行操作,即使 num
仍然是 Int。这是一个糟糕的想法,只是作为使用双关语的玩具示例。
我很难理解*(uint32_t*)
。
假设我有:
uint32_t* ptr;
uint32_t num
*(uint32_t*)(ptr + num); // What does this do? Does it
uint32_t
是保证32位的数值类型。该值是无符号的,这意味着值的范围从 0 到 232 - 1.
这个
uint32_t* ptr;
声明了一个uint32_t*
类型的指针,但指针未初始化,即
也就是说,指针没有特别指向任何地方。尝试通过该指针访问内存将导致未定义的行为,您的程序可能会崩溃。
这个
uint32_t num;
只是一个uint32_t
类型的变量。
这个
*(uint32_t*)(ptr + num);
ptr + num
returns你一个新的指针。它被称为指针算术。这就像常规算术,只是编译器将类型的大小放入
考虑。将 ptr + num
视为基于原始 ptr
指针的内存地址加上 num
uint32_t
对象的字节数。
(uint32_t*) x
是演员表。这告诉编译器它应该将表达式 x
视为 uint32_t*
。在这种情况下,甚至不需要,
因为 ptr + num
已经是 uint32_t*
.
开头的*
是解引用操作符,用于通过指针访问内存。整个表达式相当于
ptr[num];
现在,因为 none 个变量被初始化,结果将是垃圾。
然而,如果你像这样初始化它们:
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。
这并没有真正做任何事情。让我给你一个不同的例子:
uint32_t data;
void *pointer = &data;
*(uint32_t *)pointer = 5;
首先,void*
表示"generic"指针。它可以指向任何类型的对象。
现在,(uint32_t *)
表示“将 pointer
解释为指向类型为 uint32_t
的对象的指针。
表达式的其余部分仅表示 "store 5 at the location stored by this pointer"。
如果您想知道 uint32_t
是什么,那是一个恰好 32 位的无符号整数。 pointer + num
与 pointer[5]
.
uint32_t
在 stdint.h
中定义,因此可能需要包含它
#include <stdint.h>
这个headershall define uint32_t
to be an unsigned integer type taking exactly 32 bits.
这种表达方式通常用于双关语。如果您不熟悉类型双关,主要思想是绕过类型系统,以便您可以将某些东西视为与实际不同的类型(即将 int a 视为 double)
类型双关背后的主要思想是你获取一个指向当前变量的指针,然后通过将它转换为该类型的指针然后取消引用它来将它转换为不同的类型,因此常用的转换和取消引用你指的是( *(uint32_t *)
= 转换为无符号 32 位 int 指针,然后取消引用)。
正如其他人指出的那样,您的代码“什么都不做”,因为您将一个 int 转换为一个 int,这没有任何效果。但是,如果您想将一个 int 双关语转换为 double...
uint32_t num=5;
double& myvar=*(double*) #
现在您可以通过 myvar
将 num
的内存作为 double 进行操作,即使 num
仍然是 Int。这是一个糟糕的想法,只是作为使用双关语的玩具示例。