x - указатель на int, это не сам int, это не адрес int, это указатель.
указатель содержит адрес типа int.
Итак, пропущенный шаг у вас (ваша программа ни на что не указывает x! Очень опасно)
int y = 5;
int *x;
x = &y // put the memory location of y into the pointer
если вы теперь печатаете содержимое указателя ...
printf("%d\n", x); // prints out the memory location of y;
теперь, чтобы получить значение того, на что указывает ваш указатель (на данный момент, y)
printf("%p\n", *x); // prints out 5;
теперь, так же как у у есть место в памяти, у х также есть место в памяти
поэтому & x находится там, где указатель 'x' находится в памяти