On 01/18/2018 04:25 PM, Luís Marques wrote:
This works, obviously (i.e. it prints 42):
void foo(ref int* a)
{
static int j = 42;
a = &j;
}
void bar(int* ptr)
{
foo(ptr);
writeln(*ptr);
}
void main()
{
int i = 7;
bar(&i);
}
Unfortunately, if bar for some reason receives a void* pointer (e.g. C
callback) this doesn't work:
void bar(void* ptr)
{
foo(cast(int*) ptr); // error
You need a reinterpret-style cast here to get an lvalue:
foo(* cast(int**) &ptr);
The result has the same type (int*), but it refers to the very same
memory location as `&ptr` does. So it's not just a temporary value, and
it can be passed in a `ref` parameter.
writeln(*cast(int*) *ptr);
You're dereferencing twice here. Do it only once, after casting:
writeln(* cast(int*) ptr);
}
Alernatively, you can make a local variable for the casted pointer and
use that instead of the `ptr`:
int* casted_ptr = cast(int*) ptr;
foo(casted_ptr);
writeln(*casted_ptr);
That way, `ptr` itself won't be updated by `foo`, of course. But `ptr`
isn't a `ref` parameter, so this only affects the insides of `bar` anyway.