Die & is de adres-operator. Die geeft dus het adres in het geheugen van een variabele weer.
Je moet het geheugen opvatten als een enorme kast met een enorm aantal vakjes. Elk vakje heeft een uniek nummer (adres). Anders zou de computer niet op ondubbelzinnige wijze het geheugen kunnen gebruiken.
Als je dus een int i declareert, reserveer je een vakje in het geheugen waar je die i instopt.Het adres (uniek nummer van dat vakje kun je krijgen door &i op te vragen.
Dat adres stop je meestal in een pointer (een wijzer, meerbepaald een wijzer naar een bepaald geheugenvakje).
Een pointer wordt met een * gedeclareerd. Bijvoorbeeld
int * p;
declareert een variabele p van het type "pointer naar integer". Daar kun je nu het adres van een integer in stoppen.
Probeer eens volgende code:
#include <stdio.h>
main(){
int i = 7;
int * p;
p = &i;
printf("%s%d\n%s%u\n", "i heeft de waarde: ", *p, "i staat op adres: ", p);
}
De variabele p bevat dus het adres. Om te weten wat de waarde is van de variable op dat adres, gebruik je *p, zoals in het print-statement. (dit heet dereferencing)
De vraag die je nu gaat stellen, is deze: wat is het nut hiervan? Wel, pointers laten toe om sneller het geheugen te benaderen. Vooral bij grote arrays (lijsten van eenzelfde type) speelt dat een rol. Gelinkte lijsten maken ook veel gebruik van pointers. Eigenlijk zijn pointers een basisconcept van C. (ook van Java bvb maar dan achter de schermen).
Ik hoop dat deze uitleg een beetje opheldert. Het is nogal abstract allemaal, maar je moet het maar eens traag herlezen en goed laten doordringen.
En als antwoord op uw vraag: de functie scanf neemt een adres als tweede argument.