繁体   English   中英

C ++取消引用void指针,将int ptr转换为void ptr

[英]C++ dereference a void pointer , converting int ptr to void ptr

这些代码行显示如下错误:

int e = 5, * ePtr = &e;
void * vPtr = ePtr; 
cout << *vPtr; 

语法错误:

`void *'不是指向对象的类型

我知道:

  1. 任何指针类型都可以存储在void指针类型中而无需显式转换
  2. 解除引用尝试void指针是语法错误

但如果我们不能做#2点,除了语法正确之外,点#1的用途是什么? 我想用vPtr打印5(即e )这可能吗?

这很好用:

int e = 5, * ePtr = &e;
void * vPtr = ePtr; //specific to generic Ok!
double * dPtr = (double *)vPtr; //to let compiler know stoarge size
cout << *dPtr; //indirectly it is vPtr i.e. a void ptr, can be deref only if cast

要遵循void*指针,您需要将指针强制转换为兼容类型。

void*指针经常在C中使用,但是,因为在C ++中我们可以执行函数重载和多态,它们的使用更加有限。

在C中使用void*指针的一个很好的例子是使用回调的函数:

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, 
                   void *(*start_routine) (void *), void *arg);

当你调用pthread_create函数时,它会调用你的start_routine 在这种情况下,您可能希望将一些数据传递给start_routine 由于线程库无法为您可能想要传递给回调的每种类型声明pthread_create函数,因此使用void*类型。

void myCallBack(void* arg) {
   int* value = (int*)arg;

   /* Do something with value: it is an int* now*/
   printf("Message from callback %d\n", *value);
}


/* Some main function or whatever... */
{ 
  /*  ... */
  int foo = 123;
  ret = pthread_create(&thread, &attr,myCallBack, &foo);

  /*  ... */
}

void*可以指向任何东西,因此为它指定任何指针都非常好。

但是因为它可能指向任何东西,所以取消引用它是不可能的:编译器不知道它指向哪个对象类型,因此根据对象的类型,它无法生成代码来做正确的事情

你不能取消引用它,因为编译器不知道它是什么。 您必须将其转换为适当的类型(编译器必须假设您知道自己在做什么)。

void *指针最适合用于与相当低级别的东西(例如I / O驱动程序)接口,在那里你很少关心你正在处理的数据,你只知道你有缓冲区和大小。

任何其他用途都充满了危险。 例如

int i = 5;
void *p = &i;
.....
float *f = (float *)p;

这将不会出现编译器错误或警告。 这完全有效。 但它不太可能达到你的预期

存储指针并对其类型保持无关紧要可能很有用。 这就是void *的用途。 在纯C中设计存储容器(链表,哈希映射)时,您可以采用一种方法。

如果你想使用指针那么你必须跟踪它的类型及其值,因为你不能随意地引用指针,并且当你转换为void *时所有类型信息都会丢失。

在您的示例中,您可以使用带有void *和type字段的简单结构。

在C ++中,您可以使用多态结构甚至模板来实现这些功能:您所做的更多是C风格。

在没有类型转换的情况下,您无法使用void*在此处打印e 指针不仅仅是一个存储地址的简单变量,但它也有一个类型,它告诉编译器使用该地址读取的大小。 如果没有类型转换,则无法取消引用void* ,因为它没有任何类型。 通过类型转换,您可以告诉编译器从指针携带的地址开始应该读取多少字节。

void*为程序员提供了一种轻松存储和使用其他类型指针的简便方法。 我们不能使用unsigned int或类似的来存储指针的值,因为指针的大小依赖于处理器。 此外,我们可以使用void*使指针参数/函数的返回值更通用。

我的事情所以你想存储指向void *指针的int指针。 在那种情况下,您可能会收到警告,例如“从不同大小的整数转换为指针”。为此您首先需要指定一些与整数相关的内存void指针,然后使用该void指针可能如下,

void *ptr = malloc(sizeof(int));
*((int*)ptr) = 5;
printf("%d\n",*((int*)ptr));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM