unsigned char array[1000];
Unsigned char * pointer = array;
printf("p%", &pointer);
Вы печатаете адрес переменной 'pointer'.
Setup(pointer);
Вы передаете переменную 'pointer' по значению в 'Setup'.
Void setup(unsigned char* pointer){
Вы приняли переменную по значению с именем 'pointer', поэтому она была создана для вас и инициализирована значением, с которым была вызвана функция.
Unsigned char * p = pointer;
Вы создали еще одну переменную с именем 'p ', которое инициализируется тем же значением, которое содержится в указателе.
printf("p%", &p);
Вы печатаете адрес этой новой переменной.Конечно, он находится в другом месте в памяти, потому что это не та переменная, которую вы напечатали в первый раз.
}
Пожалуйста, просмотрите эту статью: http://crazyeddiecpp.blogspot.com/2010/12/pet-peeve.html