It helps to think of declaration and definition as two separate things (sometimes written on the same line). Identifiers, with or without the const qualifier, can be
declared only once per program (the "extern" qualifier notwithstanding). However, identifiers can be
defined multiple times, unless they were declared const.
Just remember that:
const int * num = (int*)0x1234;
makes a modifiable pointer (located somewhere in RAM) to a read-only integer (which is located at the address 0x1234) and:
int * const num = (int*)0x1234;
would make a non-modifiable pointer (hopefully in ROM, in the case of the VB) that points to a writable integer (located at the address 0x1234).
Also, the compiler
should store "const" data/pointers in, and access them from, the ROM, thus saving space in the WRAM area for things that can actually be written.
At least I
think that's how it works, anyway. If it doesn't, it should

What I don't get is why the following:
int * const num = (int*)0x1234;
int * num2;
void main (void) {
num2 = num;
return;
}
Makes the compiler spit out: "warning: assignment discards qualifiers from pointer target type".
"const" here isn't a qualifier of the
target type, but of the pointer's type.
And besides that, if it's just the pointer that's a const, then what difference does it make that I'm assigning the address contained in that const pointer to another pointer? They're both pointers to writable memory, so there's no chance of breaking something by ignoring the const.
Anyone want to enlighten me?