I understand the way print1
function works, but how come when calling print2
function I don't need to pass the address of the argument but rather I just need to cast it to void pointer? I don't understand how the output is correct. What does it mean when I say (void*)20
? And then what does the whole "int n = (int)param
inside the print2
function does?
#include <stdio.h>
#include <stdlib.h>
void print1(void* param)
{
int n = *((int*)param);
printf("You sent: %d\n", n);
}
void print2(void* param)
{
int n = (int)param;
printf("You sent: %d\n", n);
}
int main()
{
int number = 10;
print1(&number);
print2((void*)20);
return 0;
}
CodePudding user response:
(void *)20
converts 20
to a pointer. Per C 2018 6.3.2.3 5, the result is implementation-defined.
print2((void*)20);
sends that pointer to print2
.
In print2
, int n = (int)param;
converts that pointer back to int
. Per C 2018 6.3.2.3 6, the result is implementation-defined. A common result is that the original integer is restored, provided it has not run afoul of limitations or complications in the addressing mechanism used in the C implementation.
printf("You sent: %d\n", n);
sends this restored int
to printf
.