用指针误解

时间:2013-10-02 16:46:39

标签: c++ c

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

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

这条线真正做了什么?

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

如何将uint8_t指针数组均衡为另一个指针? 我理解得好,或者这行做什么?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

当你想要施法时,在投射前和施法后考虑两个数据的大小。如果您的尺寸为before cast > after cast,请不要这样做,因为您的数据会丢失。

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

答案 2 :(得分:0)

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

无论如何,上面的代码正在转换一个指向uint8_t类型指针的字符指针。你最好避免这种演员阵容。这是有效的,因为它们只需要一个字节。但是,一般来说最好避免使用它们。

答案 3 :(得分:0)

详细说明:

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

    typdef unsigned char uint8_t;

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

  • text被声明为指向signed char的指针数组,并被定义为20 * sizeof(char *)的数组,在32位系统上为80,在64位系统上为160.

代码行,

rowoftext = (uint8_t *)text[textrow++];
  • 确定变量textrow的值(可能定义为int或unsigned int
  • 增加textrow变量中存储的值
  • 找到数组文本的textrow元素并解引用该地址,相当于

    *(文本+ textrow)

  • 此表达式的类型为(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元素数组的常量指针。两个示例都声明了变量(sic),它们可以与[]运算符一起使用来处理uint8_t的数组,就像这样,

rowoftext[ integer ]

相当于

*(rowoftext + integer)