假设我有一些数据(例如,代表灰度图像像素的数字)是从文件中读取并打包到指向uint8_t的指针中的。
uint8_t* data = getData(readFile(filePath));
如果我真正了解uint8_t指针是什么,它就像一个无符号字符数组(uint8_t映射到无符号字符),换句话说,它是一个指向无符号字符数组的第一个元素的指针。它是否正确?
我的问题是:
1)如何在c ++中打印值数据指向的位置?
我在C
中读到,可以像这样printf(*data)
或
printf( data[0] )
。参见Print out the value uint8_t *
但是如何在c ++中做到这一点?
2)是否有一种方法(循环)遍历值数据点? 像这样:
for(auto i=0; i< data.size; i++) {
auto d = data[i];
}
答案 0 :(得分:0)
要使用c ++进行打印,请使用printf("%d", data[0] )
和std::cout << data[0];
,而不是printf("%d", *data )
请注意,std::cout << *data;
根据数据类型进行格式化,如果您要更改某些内容,则需要更多: std::cout <<
。
此外,当您使用指针(在C或C ++中无关紧要)时,在指针有效之前,您不应访问数据。至少检查#include <iomanip>
,然后在表达式中使用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
答案 1 :(得分:0)
它是指向无符号字符数组的第一个元素的指针。它是否正确?
uint8_t*
是指向uint8_t
类型的对象的指针。如果uint8_t
是unsigned char
的别名,则uint8_t*
实际上是指向unsigned char
的指针。
它可以指向null,也可以指向没有对象(悬空指针)的地址,也可以指向对象。我们不能说这个指向对象是否是数组的第一个元素。如果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