Прежде всего, вы не знаете, действителен ли адрес 0x00018EA0
или нет.
В первой программе вы не обращаетесь к ячейке памяти 0x00018EA0
, вы просто обращаетесь кадрес и адрес указателя.
printf("%x\n%x\n%x\n",address,flashLocat,&flashLocat);
// address --> is value of pointer, so it is valid
// flashLocat --> is value of pointer, so it is valid
// &flashLocat--> is the address of flashLocat, so it is valid
Но во второй программе вы фактически получаете доступ к ячейке памяти, которая выдает ошибку, если адрес неверен.
printf("%x\n%x\n%x\n%x\n",address,*flashLocat,flashLocat,&flashLocat);
// *flashLocat --> trying to access the location, can be INVALID