从void指针设置和获取值的不同方法

时间:2015-11-15 12:07:01

标签: c pointers void-pointers

当浏览一些关于void指针的链接时,我在设置和获取void指针的值时看到了两种类型,

int main() {
    int i = 5;

    //This is first way.

    void *vPtr = (void *) i;

    //printing value of *vPtr,
    printf("Getting value in first way, %d\n", (int)vPtr);

    //This is second way.
    *vPtr = &i;

    //printing in second way,
    printf("Getting value in second way, %d\n", *((int*)vPtr));
}

它们都会给出相同的价值。虽然我知道第二种方法是如何工作的,但我不完全确定,第一种方法是如何工作的。处理这两个中的void指针时,理想的方法是什么?

对于第一种方法,这是我所指的代码段。虽然他传球很长,但我也可以用int做同样的事情。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#define NUM_THREADS 5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main(int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0;t<NUM_THREADS;t++){
     printf("In main: creating thread %ld\n", t);
     rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
     if (rc){
       printf("ERROR; return code from pthread_create() is %d\n", rc);
       exit(-1);
       }
     }

   /* Last thing that main() should do */
   pthread_exit(NULL);
}

2 个答案:

答案 0 :(得分:0)

第一种方法使用指针作为整数的存储空间;第二种方法分别存储整数,并使用void*指针指向它。

指针能够保存内存地址。由于存储器地址本质上是数值,因此指针能够存储数字。然而,这些数字的范围取决于系统。例如,您可以通过将指针传递给带有printf格式说明符的%p来将指针重新解释为整数。 printf生成的数值是系统定义的,但您将为指针打印一些数字。

保证第二种方法有效。此外,如果您更改i,则线程看到的值也会发生变化。

这意味着指针指向的值必须在线程可以访问它的时间内保持不变。这意味着如果您要更改线程代码以使用第二种方法,则单个t是不够的;你必须创建一个NUM_THREADS元素数组,并将每个线程的地址传递给另一个元素。

第二种方法可能适用于大多数硬件,因为int通常适合指针的空间。但是,C99标准不保证它。完成赋值后,对i的更改不会影响线程看到的整数值。

您可以在this Q&A中找到有关将int转换为void*主题的更多信息。

答案 1 :(得分:0)

void *vPtr = (void *) i;

i解释为指向某事物的指针。在您的示例中,vPtr现在指向地址0x00000005

 *vPtr = &i;

这会占用i地址

这完全取决于你想做什么。