C++ C++;/Arduino了解uint8\u t和*

C++ C++;/Arduino了解uint8\u t和*,c++,C++,有人能解释一下这个代码块里发生了什么吗?特别是第3行。我有一种预感,ptr之前的*是重要的。而且(uint8\u t*)看起来像是对字节的转换。。。但这是怎么回事?看起来r、g和b的计算结果都是相同的 case TRUECOLOR: { // 24-bit ('truecolor') image (no palette) uint8_t pixelNum, r, g, b, *ptr = (uint8_t *)&imagePixels[imageLine * N

有人能解释一下这个代码块里发生了什么吗?特别是第3行。我有一种预感,ptr之前的*是重要的。而且
(uint8\u t*)
看起来像是对字节的转换。。。但这是怎么回事?看起来r、g和b的计算结果都是相同的

case TRUECOLOR: { // 24-bit ('truecolor') image (no palette)
  uint8_t  pixelNum, r, g, b,
          *ptr = (uint8_t *)&imagePixels[imageLine * NUM_LEDS * 3];
  for(pixelNum = 0; pixelNum < NUM_LEDS; pixelNum++) {
    r = *ptr++;
    g = *ptr++;
    b = *ptr++;
    strip.setPixelColor(pixelNum, r, g, b);
  }
case-TRUECOLOR:{//24位('TRUECOLOR')图像(无调色板)
uint8_t像素数,r,g,b,
*ptr=(uint8_t*)和imagePixels[imageLine*NUM_led*3];
用于(pixelNum=0;pixelNum
我主要在C#中工作。

星号(*)是指针的符号。因此(uint8_t*)是对指向uint8_t的指针的强制转换。然后在循环中,星号前缀是取消引用该指针的符号(即*ptr)。取消引用指针返回指针指向的数据

我建议阅读一些关于指针的内容,因为它们对理解C/C++非常重要。下面是星号(*)是指针的符号。因此(uint8_t*)是指向uint8_t的指针的强制转换。然后在循环中,星号前缀是符号(即*ptr)即取消对该指针的引用。取消对该指针的引用将返回该指针所指向的数据


我建议阅读一些关于指针的内容,因为它们对于理解C/C++至关重要。下面是

第二行和第三行可以更清晰地表达:

uint8_t pixelNum;
uint8_t r;
uint8_t g;
uint8_t b;
uint8_t *ptr = (uint8_t *)&imagePixels[imageLine * NUM_LEDS * 3];
前四个变量声明应该相当简单,第五个是C#没有的。它将
ptr
声明为指向
uint8_t
的指针。该指针设置为值的地址,该值是
imagePixels
数组中的
imageLine*NUM_led*3
第个元素。因为这可能是一个dif其他类型(可能是指向
char
的指针,谁知道呢),此值被转换为指向
uint8\t
的指针

下一个出现的星号(
*
)在for循环体中,它用作解引用运算符,基本上解析指针以获取实际值

指针101 指针就像一所房子的街道地址。它告诉你房子在哪里,这样你就可以找到它,但是当你传递它时,你不会传递整个房子。你可以取消对它的引用,这意味着你可以实际访问房子

与指针结合使用的两个运算符是星号(
*
)和符号(
&
)。星号用于指针声明和取消指针引用,符号用于获取某物的地址

请看以下示例:

int x  = 12;
int *y = &x;

std::cout << "X is " << *y; // Will print "X is 12"
指针102
指针是一个很大的主题,我建议您在必要时花点时间从不同的来源阅读它们。

第二行和第三行可以更清晰地表达:

uint8_t pixelNum;
uint8_t r;
uint8_t g;
uint8_t b;
uint8_t *ptr = (uint8_t *)&imagePixels[imageLine * NUM_LEDS * 3];
前四个变量声明应该相当简单,第五个是C#没有的。它将
ptr
声明为指向
uint8_t
的指针。该指针设置为值的地址,该值是
imagePixels
数组中的
imageLine*NUM_led*3
第个元素。因为这可能是一个dif其他类型(可能是指向
char
的指针,谁知道呢),此值被转换为指向
uint8\t
的指针

下一个出现的星号(
*
)在for循环体中,它用作解引用运算符,基本上解析指针以获取实际值

指针101 指针就像一所房子的街道地址。它告诉你房子在哪里,这样你就可以找到它,但是当你传递它时,你不会传递整个房子。你可以取消对它的引用,这意味着你可以实际访问房子

与指针结合使用的两个运算符是星号(
*
)和符号(
&
)。星号用于指针声明和取消指针引用,符号用于获取某物的地址

请看以下示例:

int x  = 12;
int *y = &x;

std::cout << "X is " << *y; // Will print "X is 12"
指针102
指针是一个很大的主题,我建议您在必要时花点时间从不同的来源阅读它们。

根据信息,我需要更多的代码来运行它来解释它。但我发现一个非常非常有用的工具是C visualizer。它是一个在线调试工具,可以帮助您通过runn了解代码中发生了什么让您一步一步、一行一行地了解。可在以下网址找到:

尽管URL上说的是python,但它可以使用C语言和一系列语言。我本想发表评论而不是发布答案,但我的代表级别不够高。我希望这能有所帮助


(我与上述网站无关,只是偶尔在困惑时使用)

如果你不了解,我需要更多的代码来解释它。但我发现一个非常非常有用的工具是C visualizer。它是一个在线调试工具,通过逐行逐行运行,帮助你了解代码中发生了什么。可以在以下网址找到:

尽管URL上说的是python,但它可以使用C语言和一系列语言。我本想发表评论而不是发布答案,但我的代表级别不够高。我希望这能有所帮助


(我与上述网站无关,只是偶尔在困惑时使用)

在变量定义中使用,
*
意味着
ptr
是一个指针。它存储的值是另一个变量或另一个变量的一部分在内存中的地址。在这种情况下,
ptr
是指向
imagePixels
内内存块的指针,从涉及的变量名称中,它是一行图像。由于类型是
uint8\u t
,因此这将取
im中的任何内容
g = *ptr++;
b = *ptr++;
strip.setPixelColor(pixelNum, r, g, b);
strip.setPixelColor(pixelNum, *ptr++, *ptr++, *ptr++);
*ptr = (uint8_t *)&imagePixels[imageLine * NUM_LEDS * 3];
for(pixelNum = 0; pixelNum < NUM_LEDS; pixelNum++) {
r = *ptr++;
g = *ptr++;
b = *ptr++;
strip.setPixelColor(pixelNum, r, g, b);