1

假设我有一些从文件中读取并打包到指向 uint8_t 的指针中的数据(例如表示灰色图像像素的数字)。

uint8_t* data = getData(readFile(filePath));

如果我真正理解了什么是 uint8_t 指针,它就像一个 unsigned char 数组(uint8_t 映射到 unsigned char),换句话说,它是一个指向 unsigned char 数组的第一个元素的指针。这个对吗?

我的问题是:

1)如何在 c++ 中打印值数据点?
我读到C它可以像这样printf(*data)printf( data[0] ). 请参阅打印出值 uint8_t *
但是如何在 c++ 中做到这一点?

2)有没有办法迭代(循环)值数据点?就像是:

for(auto i=0; i< data.size; i++) {
   auto d = data[i]; 
}
4

2 回答 2

1

它是指向 unsigned char 数组的第一个元素的指针。这个对吗?

uint8_t*是指向类型对象的指针uint8_t。如果uint8_t是 的别名unsigned char,则uint8_t*确实是指向 的指针unsigned char

它既可以指向空值,也可以指向一个没有对象的地址(悬空指针),也可以指向一个对象。那个指向的对象是否是数组的第一个元素,我们不可能说。如果 的文档getData说它是,那么我们能做的最好的就是假设它没有说谎。如果没有文档,那么我们需要查看实现以了解它的作用。

1)如何在 c++ 中打印值数据点?

尽管printf在 C++ 中也可以使用,但众所周知,初学者很难正确使用它(事实上,您的建议并不正确)。std::cout最好,您可以从标题中插入一个对象<iostream>以打印它(使用流插入运算符<<)。例子:

std::cout << data[0];

但是,如果uint8_t确实是 的别名unsigned char,则数据将作为字符流式传输。如果要流式传输整数值,则需要先将值转换为非字符整数类型:

std::cout << int(data[0]);

要打印数组等数据结构,可以遍历数组并打印每个元素,

2)有没有办法迭代(循环)值数据点?

是的。

但是,为了迭代数组,您需要以某种方式知道何时停止迭代。这与知道数组的结束位置相同。这也是文档getData应该揭示的东西。数组是否具有恒定长度?数组是否被某个值终止?它是否设置了一些全局变量来为我们提供数组的长度?也许; 我们无法知道。

您可以使用以下算法:

1 let the pointer point to the first element of the array
2 if the pointer points to the end of the array, you're done
3 indirect the pointer to get the value at current index
4 you you can now for example print the value
5 increment the pointer
6 jump to 2
于 2018-08-28T13:48:06.560 回答
0

要在 c++ 中打印,请printf("%d", data[0] )改用std::cout << data[0];,而printf("%d", *data )改用std::cout << *data;

请注意,std::cout <<根据数据类型进行格式化,如果你想改变一些你需要更多的东西:例如#include <iomanip>

此外,当您使用指针(在 C 或 C++ 中无关紧要)时,您不应该在指针有效之前访问数据。至少检查data != NULL然后*data在表达式中使用。

最重要的是——如果data是指针,就像uint8_t* data;它没有属性(字段)一样data.size,所以循环应该以其他方式组织。我的意思是,你必须找到其他方法来知道该指针有多少数据可用......例如:

 size_t size = ... // calculate the length of array before loop
 for (size_t cnt = 0; cnt < size; cnt++) {
      std::cout << data[cnt];
 }

或者如果数组末尾由特殊值定义,则可以是:

 uint8_t* ptr = data;
 while ( *ptr != END_MARKER ) {
      std::cout << *ptr;
      ptr++;
 }

更新:

如果不是uint8_t*,但类似于队列结构

typedef struct{
   uint8_t    data;
   QueueItem* next;
} QueueItem;

NULL指针本身可以是END_MARKER,例如:

 QueueItem* ptr = queue;
 while ( ptr != NULL ) {
      std::cout << ptr->data;
      ptr = ptr->next;
 }
于 2018-08-28T12:52:29.267 回答