What is &y? Is it the address in memory of the pointer variable y?
Yep. You can have pointers-to-pointers as well.
int x = 357;
int *y = &x;
int **z = &y;
What is the pointer variable y? Does it hold the address of the variable x?
Yes. Basically, it is an integer-ish type that (as its value) holds the address of 'x'.
What is &x? Is it the address in memory of the variable x itself or is it the address its value, 1025?
The address to the variable, which, with an integer, is also where the value is stored.
What is the variable x? Is it the address of its value, 1025?
It is the location in memory of several bytes, that hold data. How the data is interpreted depends on the code that uses it. With integers, the data is meant to represent a number (like 1025) but it could just as easily be manipulated as if it was something else, like a couple chars or a float. Data in memory is merely data in memory - what gives it meaning is how it is used.
What is *y? Is it the address of 1025 = variable x ?
1025 is merely the data stored at the address of 'x', the value stored in those bytes of memory doesn't change the location of 'x' at all. Once 'x' is created, it's location in memory (for the duration of its lifetime) doesn't change.
So *y is x. *y 'dereferences' the address stored in 'y' (x's address), and so then you're operating on the block of memory that both 'x' and '*y' refer to.
If printing &y displays the address of y, printing &x displays the address of x, but printing x/*y just prints 1025, how would I print the address of 1025?
Printing x/*y should print 1. x = 1025. *y = 1025. 1025/1025 = 1
1025 doesn't have an address. 1025 is a bunch of bits in a few bytes somewhere. 1025 is the sequence of bits (that your code gives a meaning to, but that has no meaning on its own) stored in several bytes that is located at the address stored in 'x' and '*y'.
If we assume an integer is four bytes of memory (32 bit OS and hardware, let's say), then you have four bytes in some random location in RAM:
[01000100] [1101010] [00101001] [11010101] (gibbish binary for illustration)
The binary bits stored in those four bytes don't mean a thing, until your code decides how to interpret the meaning of those bits.
'x' is those four bytes. 1025 is converted to binary and stored in those four bytes. The address of 'x' is the address of those four bytes. 'y' is a chunk of bytes that you store the address of 'x' at. '*y' lets you operate on the bytes that 'y' stored the address of. Accessing *y gives the same bytes pointed to that x refers to.
gcc -Wall -g) and then step by step it using some debugger (e.g.gdb)? Show much more of your C code.