Option A will not exchange the values of $x$ and $y$ because parameters are passed by value in C. i.e., the code is exchanging $x'$ and $y'$ which are having the values of $x$ and $y$ respectively.
Option B will not swap the value
void swap(int a, int b)
Here, it is wrong to pass in address (int*) as the parameters are of int type, even sizeof int and int* varies depending on the compiler. Now, even if ignoring this error, the given code would not exchange the values of $x$ and $y$ as it is merely exchanging $p_1'$ and $p_2'$ where $p_1'$ and $p_2'$ are containing the copies of the addresses of $x$ and $y$ respectively. (Even addresses are passed by value in C language).
Option C is false, return value is not required for exchanging the variables.
Option D is correct. We cannot use $swap(x,y)$ because parameters are passed by value. Only way now to exchange the variables are by passing their addresses and then modifying the contents using the de-referencing operator $(*).$