That's not correct. They are exactly the same. The postfix++ is called first, then the *, for both.
The postfix++ returns the old value, before the increment, of course, but it's still called first in both cases.
Maybe you're getting confused because the * is applied to the old value, but it's not applied until after the increment (at least conceptually; there could be an optimization to do it first so a copy doesn't need to be made in the pure pointer case).
Here's an example with assembly, compiled without optimization:
Code:
#include <stdio.h>
int main() {
int a[] = {0,1,2,3,4};
int *p = a;
int n = *p++;
int m = *p++;
printf("%d %d\n", n, m);
return 0;
}
Code:
.LC0:
.string "%d %d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $48, %rsp
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
movl $0, -32(%rbp)
movl $1, -28(%rbp)
movl $2, -24(%rbp)
movl $3, -20(%rbp)
movl $4, -16(%rbp)
; p = a
leaq -32(%rbp), %rax
movq %rax, -40(%rbp)
; p++
movq -40(%rbp), %rax
leaq 4(%rax), %rdx
movq %rdx, -40(%rbp) ; stores new value back to stack
; n = *p
movl (%rax), %eax ; uses old value, still in rax
movl %eax, -48(%rbp)
; p++
movq -40(%rbp), %rax
leaq 4(%rax), %rdx
movq %rdx, -40(%rbp)
; m = *p
movl (%rax), %eax
movl %eax, -44(%rbp)
; printf("%d %d\n", n, m)
movl -44(%rbp), %edx
movl -48(%rbp), %eax
movl %eax, %esi
leaq .LC0(%rip), %rdi
movl $0, %eax
call printf@PLT