To understand this you must know about variables that are local to a block and passing values with reference to a function. When you pass variables to a function (unless it is an array) a change won't be reflected to the variable's value if you don't use the &(ampersand called the address operator) this ensures that the value of the variable you passed will change, we need to change the value when reading input thus in scanf() we use & with variable but in printf() we only need to read those values and not change them thus we don't need to use the & operator. Simply put if you used '&', it would think you want to show the address of the variable used as & is the address operator.