Hopefully a little extra output will make things self-explanatory.
int main(void) {
int p_arr[4] = {3, 5, 6, 1}, q_arr[4] = {7, 2, 9, 5};
int *p = p_arr;
int *q = q_arr;
int i = 1;
printf("\t");
printf("i:%d p:%p,%d q:%p,%d\n", i, p, *p, q, *q);
printf("%d\t", *p + *q);
printf("i:%d p:%p,%d q:%p,%d\n", i, p, *p, q, *q);
printf("%d\t", *(p++) + *(++q));
printf("i:%d p:%p,%d q:%p,%d\n", i, p, *p, q, *q);
printf("%d\t", *(++p) + *(q++));
printf("i:%d p:%p,%d q:%p,%d\n", i, p, *p, q, *q);
printf("%d\t", *(p + i) + *q + i);
printf("i:%d p:%p,%d q:%p,%d\n", i, p, *p, q, *q);
printf("%d\t", *p + i + *(q + i));
printf("i:%d p:%p,%d q:%p,%d\n", i, p, *p, q, *q);
return 0;
}
Output
i:1 p:0xffffcaf0,3 q:0xffffcae0,7
10 i:1 p:0xffffcaf0,3 q:0xffffcae0,7
5 i:1 p:0xffffcaf4,5 q:0xffffcae4,2
8 i:1 p:0xffffcaf8,6 q:0xffffcae8,9
11 i:1 p:0xffffcaf8,6 q:0xffffcae8,9
12 i:1 p:0xffffcaf8,6 q:0xffffcae8,9
*
and++
separately? If yes, what's confusing you?