对指针的误解
Misunderstanding with pointers
我使用的代码采用用户定义的字符串并将其打印到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类型指针。最好避免这样的演员表。这是有效的,因为它们都只占用一个字节。但是,一般来说,最好避免它们。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- C++:误解内存地址和指针的复制值
- 对指针的误解
- 对原子结构和指针的误解
- 在C++中将指针作为参数传递,我有什么误解