it is D;
in call by reference value of actual variable can be changed as we have got its address
in Dynamic scoping free variable are resolved from previous function call.
main() is calling m(a); thus a call m(addressof_a) will be made.
now coming m(y), a's address value will be copied to *y. so now inside m() we have local variable a=1 and y=&a
"a=y-a" will update the local a's value to 2. now m() calls n() by passing address_of_local_variable_a.
coming to n(a), a's address value will be copied to *x. Now inside n() there is no local variable 'a' is defined/declared. so now it will look for a's value into upper/previous function i.e. m(). since a local variable 'a' is defined into m(). So its value a=2 will be taken.
note that here x is a pointer pointing to variable 'a' which was declared in m().
now (*x)=(*x)*a will evaluated as 4 which will update the value of 'a' declared in m(). so now coming to print statement address_of_a is passed as argument which will print 4.
after n() calling is over m() will return back to the position where it left and continue just after next statement. which print a's updated value i.e. 4
so finally in output we will have 4,4