我有一个带有以下签名的函数:
array.sort.each_cons(2) { |x, y| puts(x) if x == y }
主要功能是这样的:
int func(void **ptr);
在int main() {
void *ptr = 0;
func((void **)&ptr));
...
}
内{我}更新func
:
ptr
但是,当我尝试在*ptr = someAddress;
中使用ptr
时,它包含值0(这意味着它尚未更新)。它让我觉得好像指针是通过值传递的,但是这是怎么回事?因为我将地址传递给main
。
答案 0 :(得分:1)
如上所述,似乎对我很好:
int thing = 13;
void *someAddress = &thing;
int func(void **ptr) {
*ptr = someAddress;
return (*((int *)someAddress) * *((int *)someAddress));
}
int main() {
void *ptr = 0;
int x = func(&ptr);
printf("%p -> %d; square = %d\n", ptr, *((int *)ptr), x);
return 0;
}
打印出新指针值及其指向的内容:
0x108410018 -> 13; square = 169
答案 1 :(得分:0)
您似乎对使用void
指针和void
指针可以表示的内容感到困惑。 void
指针可以表示任何指针(例如char **p = NULL; void *vp = p;
,它也可以是char ***p
)。不要求您将原始指针的间接级别与其void
表示相匹配。重要的是当你使用时你如何处理void
指针。例如,您可以轻松编写func
:
int func (void *ptr)
{
void **p = ptr;
*p = &STR;
return (int)strlen (*p);
}
您在ptr
中传递地址字符串的位置。例如,这段短代码(我猜一点)似乎完成了你想要完成的任务:
#include <stdio.h>
#include <string.h>
#define STR "some string."
int func (void *ptr);
int main (void) {
char *p = NULL;
printf (" length : %d\n", func (&p));
printf (" string : %s\n", p);
return 0;
}
int func (void *ptr)
{
char **p = ptr;
*p = (char *)&STR;
return (int)strlen (*p);
}
<强>输出强>
$ ./bin/voidptr
length : 12
string : some string.
如上所示,char **p
中的main
作为void *
传递给func
,但重要的考虑因素是使用ptr
func
。要将ptr
视为void **
,您必须在func
中通过第二个指针void **
将其用作p
。正如评论中指出的那样,最好将p
声明为char **
。
仔细看看,让我知道我是否正确猜到了你的尝试,以及是否还有其他问题。