Because it's passed as a straight arg rather than as reference or pointer. Think of it this way:
In not_alter, it's passing the value of n. It's not actually passing n. It's like taking a photo of a guy and drawing stuff on it; the guy's face doesn't change. It's just a photograph. When an arg is passed without pointer or reference it is a copy of that argument that is created within function scope, and then that is modified. The original remains untouched.
WHen you pass a pointer (or the more common reference) however, you are passing the address of the object or variable and not its value. By dereferencing that pointer you are now referring to the original object and thus changes therein are made on the original and not a copy.