Actually you have to print the address , is it .If you want the print the address of the variables you have to use '&' since you are trying to get the variables address.If you give the pointer there there there is no need for '&'.
printf("%p %p\n",&a,&i); // use &
printf("%p %p\n",&a,&i); //use &
The following is the correct way with out '&'.
printf("%p",p); // No need for & since it is a pointer