对指针的误解

Misunderstanding with pointers

本文关键字:误解 指针      更新时间:2023-10-16

我使用的代码采用用户定义的字符串并将其打印到VGA监视器上,使用保存在头文件中的预定义字体数组。但是有些代码行我在其他源代码中无法理解,例如:

uint8_t *rowoftext ; 
char *text[20] = {"string1","string2",.......,"srting20"};

这条线到底有什么作用?

rowoftext = (uint8_t *)text[textrow++];

如何将一个uint8_t指针数组均衡到另一个指针?我是否理解得很好,或者这条线有什么作用?

(uint8_t *)称为强制转换。它将一种类型转换为另一种类型,在本例中,一种指针类型转换为另一种指针类型。如果指向的对象不兼容,这是非常危险的,但在本例中它们是兼容的。

血腥详细解释:

uint8_t *rowoftext;
char *text[20] = {"string1","string2",.......,"srting20"};
  • uint8_t(可能(在头文件中的某处定义为:

    typdef unsigned char uint8_t;

  • rowoftext 声明为指针,并使用文件范围定义为指向uint8_t的指针,并分配默认值 NULL。

  • Text 声明为指向有符号 char 的指针数组,并定义为 20*sizeof(char*( 的数组,在 32 位系统上为 80,在 64 位系统上为 160。

代码行,

rowoftext = (uint8_t *)text[textrow++];
  • 确定变量 textrow 的值(可能定义为 int 或无符号 int
  • 递增存储在文本行变量中的值
  • 定位数组文本的 textrow'th 元素并取消引用该地址,等效于,

    *(文本+文本行(

  • 此表达式的类型为 (char*(,因为 text[] 的类型为 (char*(

  • 将指向字符 (char*( 的指针强制转换为另一个无符号指针类型 (uint8_t(
  • 未更改的指针存储在变量 rowoftext 中

如果要在此语句之前查看 rowofText,它会存储 NULL 或以前分配的指针值。 现在,变量rowoftext包含存储在text[textrow]中的指针(地址(。

textrow 的后递增增加了变量 textrow 的值,但在增量之前使用了 textrow 的值。 这个成语在 C 和 C++ 中很常见。

以下两个声明之间存在差异,

uint8_t *rowoftext;
uint8_t rowoftext[ integer_expression ];

第一个将rowoftext声明为保存指针的变量,指针可以为其分配数组的基址,然后通过递增指针来用于遍历数组。第二个声明指向uint8_t元素数组的常量指针。 这两个示例都声明了变量 (sic(,这些变量可以与 [] 运算符一起使用来寻址uint8_t数组,如下所示:

rowoftext[ integer ]

相当于

*(rowoftext + integer)

如果要强制转换,请考虑转换前和转换后这两个数据的大小。如果您的大小before cast > after cast,请不要这样做,因为您的数据会丢失。

在您的演员表中,计算您之前和之后的尺寸。

我认为它应该是char *text[20]而不是char text[20]。否则,它没有意义。

无论如何,上面的代码将字符指针强制转换为uint8_t类型指针。最好避免这样的演员表。这是有效的,因为它们都只占用一个字节。但是,一般来说,最好避免它们。