C 通过指向void的指针传递值

C 通过指向void的指针传递值,c,C,代码段将id的值传递给采用常规void*结构的例程。我对它的工作原理感到困惑:为什么你可以将长转换为无效*,然后用长将其转换回 特别是,我在想,如果要通过指针传递,那么应该将变量的地址(如&id传递给test()函数 #include <stdio.h> void test(void * id) { long myid; myid = (long) id; printf("my id is %ld\n", myid); } int main() {

代码段将
id
的值传递给采用常规
void*
结构的例程。我对它的工作原理感到困惑:为什么你可以将
转换为
无效*
,然后用
将其转换回

特别是,我在想,如果要通过指针传递,那么应该将变量的地址(如
&id
传递给
test()
函数

#include <stdio.h>

void test(void * id) {
    long myid;
    myid = (long) id;
    printf("my id is %ld\n", myid);
}

int main() {
    long id = 5;
    test( (void *)id);
}
#包括
无效测试(无效*id){
长粘虫;
myid=(长)id;
printf(“我的id是%ld\n”,myid);
}
int main(){
长id=5;
测试((无效*)id);
}
它可以工作,因为(在您的系统上!)
void*
指针本身包含足够的位来容纳
值的所有位。这不是便携式的

您是对的,您通常会将
long*
投射到
void*
并返回。这是可移植的。

它可以工作,因为(在您的系统上!)
void*
指针本身包含足够的位来保存
长值的所有位。这不是便携式的


您是对的,您通常会将
long*
投射到
void*
并返回。这是可移植的。

它可以工作,因为指针只是数字

您的测试函数“认为”它收到了指向内存位置5的指针,您当然可以打印这个地址。您将无法为此位置分配任何内容,因此*myid=42将导致分段错误。将数字转换为指针在语法上是正确的,因此编译器不会抱怨,但没有任何意义。运行此代码并查看指针在打印时的外观(忽略编译器发出的警告)

#包括
无效测试(无效*id,长*foo){
长粘虫;
myid=(长)id;
printf(“我的id是%ld,%ld\n”,我的id,foo);
}
int main(){
长id=5;
龙富,;
foo=42;
测试((无效*)id和foo);
}

它之所以有效,是因为指针只是数字

您的测试函数“认为”它收到了指向内存位置5的指针,您当然可以打印这个地址。您将无法为此位置分配任何内容,因此*myid=42将导致分段错误。将数字转换为指针在语法上是正确的,因此编译器不会抱怨,但没有任何意义。运行此代码并查看指针在打印时的外观(忽略编译器发出的警告)

#包括
无效测试(无效*id,长*foo){
长粘虫;
myid=(长)id;
printf(“我的id是%ld,%ld\n”,我的id,foo);
}
int main(){
长id=5;
龙富,;
foo=42;
测试((无效*)id和foo);
}
我不明白它为什么会起作用:为什么你可以把长的抛向虚空,然后用长的抛回

这实际上是有效的。基本上,您的意思是通过指向函数
测试的
void
指针,该指针包含
5
的地址

void测试(void*id)
中,您将该指针投射回
long
,该指针也是有效的

请注意,在您的代码中,您从未遵从指针,因此一切正常。如果在
test
中取消引用指针
id
,通常会由于内存访问错误而导致segfault

我不明白它为什么会起作用:为什么你可以把长的抛向虚空,然后用长的抛回

这实际上是有效的。基本上,您的意思是通过指向函数
测试的
void
指针,该指针包含
5
的地址

void测试(void*id)
中,您将该指针投射回
long
,该指针也是有效的


请注意,在您的代码中,您从未遵从指针,因此一切正常。如果在
test
中取消引用指针
id
,通常会由于内存访问不良而导致segfault。

这不是打印
foo
值的正确方法。使用
printf(“%p”,(void*)foo);/*更好的*/
printf(“%ld”,(long)foo);/*更糟糕的是*/
指针不仅仅是数字。著名的是,8086个“远”指针是两个数字。(段/偏移)这不是打印
foo
值的正确方法。使用
printf(“%p”,(void*)foo);/*更好的*/
printf(“%ld”,(long)foo);/*更糟糕的是*/
指针不仅仅是数字。著名的是,8086个“远”指针是两个数字。(段/偏移)
#include <stdio.h>

void test(void *id, long *foo) {
    long myid;
    myid = (long) id;
    printf("my id is %ld, %ld\n", myid, foo);
}

int main() {
    long id = 5;
    long foo;
    foo = 42;
    test( (void *)id, &foo);
}
long id = 5;
test( (void *)id);