当浏览一些关于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);
}
答案 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
的地址。
这完全取决于你想做什么。