0

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

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

这条线的真正作用是什么?

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

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

4

4 回答 4

5

该位(uint8_t *)称为演员表。它将一种类型转换为另一种类型,在这种情况下,一种指针类型转换为另一种指针类型。如果指向的对象不兼容,这是非常危险的,但在这种情况下它们是兼容的。

于 2013-10-02T16:49:40.027 回答
0

详细解释:

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

    typdef unsigned char uint8_t;

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

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

代码行,

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

    *(文本+文本行)

  • 这个表达式的类型是 (char*),因为 text[] 的类型是 (char*)

  • 将指向 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 元素数组的常量指针。这两个示例都声明了变量(原文如此),这些变量可以与 [] 运算符一起使用来寻址 uint8_t 数组,如下所示,

rowoftext[ integer ]

这相当于

*(rowoftext + integer)
于 2013-10-04T02:56:04.320 回答
0

当您要进行转换时,请考虑转换前和转换后这两个数据的大小。如果你的尺寸before cast > after cast,不要这样做,因为你的数据会丢失。

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

于 2013-10-02T16:54:20.607 回答
0

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

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

于 2013-10-02T16:58:28.603 回答