CASE 1:
#include <stdio.h>
int main()
{
    int arr[3] = {2,3,4};
    char *p;
    p = (char*) arr;
    printf(" %p - %d\n",&p, *p);
    p = p+1;
    printf("%p - %d\n",&p, *p);
    return 0;
}
output:
0x7ffde540b000 - 2  
0x7ffde540b000 - 0
In above code value of pointer 'p' is increased by 1 - but address doesn't changed.
Again I increased the value of p by 4 (i.e p = p+4). This time I get the following output -
0x7ffe50a2dff0 - 2  
0x7ffe50a2dff0 - 3
pointer move to the location arr[1] and prints the correct value.
but address doesn't changed.
CASE 2:
Now rewritten the above code (removed '&' from print statement)
printf(" %p - %d\n", p, *p);
p = p+1;
printf(" %p - %d\n", p, *p);
output -
0x7ffdb20b9d1c - 2  
0x7ffdb20b9d1d - 0
address changed by 1.
and similarly it works correctly when I update the code with p = p+4;
Output -
0x7ffef8735d6c - 2  
0x7ffef8735d70 - 3 
Address increased by 4.
I am not getting why address is not changed, when I am using '&' in print statement (CASE I).
What is difference between '&p' and 'p' in this case.
OS is Kubuntu and compiler GCC.

%prequires a(void *). If you don't cast it to that type, the result is undefined behavior.