指向指针的通用指针
Generic pointer to pointer
我知道根据标准 void *
是通用指针,而 void **
不是。因此,在我的程序中,我试图转换 void *
而不是直接输入转换 void **
但我没有得到预期的结果。我想我在这里遗漏了一些非常基本的东西。
#include <stdio.h>
void check(void **p)
{
printf("value: %d\n", *(int *)*p);
}
int main()
{
int a[] = {6,2,5,1,8};
int *p;
p = a;
void **val;
val = (void *)p;
check(val);
return 0;
}
我有一个 void **
指针 val
,它指向 int *
但被转换为 void *
。我将其传递给函数 check
,它期望 void **
。在我的 printf
中,我首先将 *p
(即 void *
)转换为 int *
,然后取消引用它。我得到一些随机值。我在这里遗漏了什么吗?
将 val = &p;
更改为 val = p;
可能是一种 "typo",因为您已经正确地传递了一次值,后来又取消引用了它。
编辑:
您可以将:val = (void *)p;
更改为 val = (void *)&p;
问题出在对 printf
的调用中:
printf("value: %d\n", *(int *)*p);
在main
中,val
(即一个void **
)包含了一个int *
的内容。然后将其传递给 check
,现在称为 p
。这需要转换为 int *
才能正确读取:
printf("value: %d\n", *(int *)p);
当然,由于void **
不是通用指针,所以这样做意义不大。最好摆脱无论如何都没有使用的额外间接级别:
void check(void *p)
{
printf("value: %d\n", *(int *)p);
}
int main()
{
int a[] = {6,2,5,1,8};
int *p;
p = a;
void *val;
val = p;
check(val);
return 0;
}
正如您自己所说,void**
不是 通用指针。它是一个指向 void*
类型对象的指针,仅此而已。使用强制转换将其指向类型 int*
的对象是类型双关语。
在您的情况下,您只需将 int*
转换为 void*
,然后再次转换为 int*
。没有 void**
涉及。
我知道根据标准 void *
是通用指针,而 void **
不是。因此,在我的程序中,我试图转换 void *
而不是直接输入转换 void **
但我没有得到预期的结果。我想我在这里遗漏了一些非常基本的东西。
#include <stdio.h>
void check(void **p)
{
printf("value: %d\n", *(int *)*p);
}
int main()
{
int a[] = {6,2,5,1,8};
int *p;
p = a;
void **val;
val = (void *)p;
check(val);
return 0;
}
我有一个 void **
指针 val
,它指向 int *
但被转换为 void *
。我将其传递给函数 check
,它期望 void **
。在我的 printf
中,我首先将 *p
(即 void *
)转换为 int *
,然后取消引用它。我得到一些随机值。我在这里遗漏了什么吗?
将 val = &p;
更改为 val = p;
可能是一种 "typo",因为您已经正确地传递了一次值,后来又取消引用了它。
编辑:
您可以将:val = (void *)p;
更改为 val = (void *)&p;
问题出在对 printf
的调用中:
printf("value: %d\n", *(int *)*p);
在main
中,val
(即一个void **
)包含了一个int *
的内容。然后将其传递给 check
,现在称为 p
。这需要转换为 int *
才能正确读取:
printf("value: %d\n", *(int *)p);
当然,由于void **
不是通用指针,所以这样做意义不大。最好摆脱无论如何都没有使用的额外间接级别:
void check(void *p)
{
printf("value: %d\n", *(int *)p);
}
int main()
{
int a[] = {6,2,5,1,8};
int *p;
p = a;
void *val;
val = p;
check(val);
return 0;
}
正如您自己所说,void**
不是 通用指针。它是一个指向 void*
类型对象的指针,仅此而已。使用强制转换将其指向类型 int*
的对象是类型双关语。
在您的情况下,您只需将 int*
转换为 void*
,然后再次转换为 int*
。没有 void**
涉及。