c ++

时间:2018-08-28 12:50:16

标签: c++ pointers unsigned-char

假设我有一些数据(例如,代表灰度图像像素的数字)是从文件中读取并打包到指向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]; 
}

2 个答案:

答案 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_tunsigned 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