我从其他一些函数收到myfunction(const void *data)
的数据,其中指针data
存储了{0,0,0,0,0,0,0,40,20,0,0,0,0,0,0}
等值。
我想只访问{40,20,0,0,0,0,0,0}
中的值并转换为double
类型的值,该值应该为8.0
。为了访问和转换为double类型,我尝试了指向double的指针:
double* dptr;
dptr=&(*data+8);
dptr;
出现错误,如
“错误:'const void *'不是指向对象的指针类型”
答案 0 :(得分:2)
在C中,您无法取消引用void指针。 因此,您可以键入强制转换void指针并使用它。 像这样的东西dptr =((double *)data + 8);因此,无效的数据现在被视为双指针。
答案 1 :(得分:1)
编辑您的帖子非常不清楚。假设data
实际上是指向double数组的指针,解决方案甚至更简单:
double * pd = static_cast<double const *>(data);
double d0 = pd[0];
double d1 = pd[1];
或(C):
double * pd= (double const *)(data);
double d0 = pd[0];
double d1 = pd[1];
您无法在void *
上执行指针算术和解除引用,因此*data
或data + 8
无效。
我不确切地知道你要做什么,但这里是你如何访问数组中的数据:
假设存储的数据实际上是int
,要访问第8个元素并将其转换为double,您应该写:
double el = static_cast<double>*(static_cast<int const *>(data) + 8));
更好的是:
int *p = static_cast<int const *>(data);
double el = static_cast<double>(p[8]);
请注意,将data
转换为原始指针类型非常重要。在我的示例中,我使用了int
,但您应该将其替换为实际数据。
在该注释中,如果您显示为{0,0,0,0,0,0,0,40,20,0,0,0,0,0,0}
的内容实际上是字节,则原始指针类型为char *
,您应该转换为char *
。
进一步阐明从指针转换数据:
假设你有一个指向int
的指针:
int i = 24;
int *pi = &i;
您如何转换为地址pi
上找到的数据的两倍?
// wrong:
double *pd = &i;
cout << *pd << endl;
这是错误的,因为您所做的是转换指针类型而不是实际数据。实际上,您将在地址pi
处找到的位模式解释为表示double
的位模式。但该位模式代表int
。
您需要做的是按原样检索数据:int
然后将int
转换为double
:
int x = *pi;
double d = (double) x;
答案 2 :(得分:0)
您无法在void指针中执行指针运算,因为您不知道内部数据的大小(正如它所说,它是无效的)。您必须将其类型化为具有已知大小的类型。
正确的类型转换和指针算法如下(使用旧的C转换):
char * ptr=(char *)data;
double * myDoublePtr=(double *)(ptr+8);
double myDouble=*myDouble;
或者,因为你有两个连续的双打:
double * ptr=(double *)data;
double myDouble=*(ptr+1); //This will access the second double.
这是因为指针算术中的偏移量会执行offset * sizeof(type)字节的跳转,因此在char类型中,跳转的字节数实际上与您的偏移量相同。
答案 3 :(得分:0)
#include <stdio.h>
#include <string.h>
double myfunction(const void *data){
double v;
memcpy(&v, data, sizeof(v));
return v;
}
int main (int argc, char *argv[]) {
unsigned char data[] = {0x40,0x20,0,0,0,0,0,0};
int i, len = sizeof(data);
//reverse data If necessary
for(i=0;i<len/2;++i){
unsigned char c = data[i];
data[i] = data[len -1 -i];
data[len -1 -i] = c;
}
double v;
v = myfunction(data);
printf("%f\n", v);//8.000000
return 0;
}