Was ist der Unterschied zwischen: scanf("%i",&x); und scanf("%i",x);

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Hallo.

Durch ein vorangestelltes Und-Zeichen (&) wird von einer Variablen die Adresse gebildet, ansonsten der Wert. Bei Datenfeldern (Arrays) ist dies etwas anders - aber das ist in deinem Fall nicht entscheidend. Eine Adresse ist eine Information darüber, wo eine Variable gespeichert ist.

Um das genauer zu verdeutlichen, werde ich mal anderes Programm schreiben :

int x, y;
x=1234;
y=1234;
printf("%i %i %i\n", x, x+10, x+20); // Zeile "A"
printf("%i %i %i\n", y, y+10, y+20); // Zeile "B"

Der Befehl "printf" weiß nicht, welche Argumente hinter ihm stehen. Die Programmiersprache C berechnet die Werte der Argumente (also 1234, 1244 und 1254) und übergibt die Ergebnisse dann an den Befehl "printf". Da die Variablen x und y den gleichen Wert haben, müssen die Zeilen "A" und "B" auch absolut das gleiche machen. Das gilt genau so auch für den Befehl "scanf":

x=wert_1;
y=wert_1;
scanf("%i", x); // "C"
scanf("%i", y); // "D"

In diesem Fall würden die beiden Zeilen (C und D) ebenfalls das gleiche machen. Im Gegensatz zu "printf" benötigt "scanf" allerdings keine Information darüber, welchen Wert die Variable hat, die eingelesen werden soll, sondern eine Information darüber, welche Variable eingelesen werden soll.

Und da die Information darüber, dass es in einem Programm überhaupt Variablen gibt, (stark vereinfacht gesagt) beim Compilieren verloren geht, muss man "scanf" nicht mitteilen, wie die Variable heißt, sondern wo die Variable ist, in die der eingelesene Wert hineingeschrieben werden soll. Daher muss man bei "scanf" das "&" verwenden.

Man kann in C aber auch sogenannte Pointer- oder Zeigervariablen definieren. Diese Variablen speichern keinen Wert ab, sondern Information darüber, wo eine Variable liegt. Damit kann man dann zum Beispiel folgendes machen;

int *x, *y, a, b;
x=&a;
y=&b;
scanf("%i",x); // Einlesen von a
scanf("%i",y); // Einlesen von b

Zur Erklärung: Variablen x und y sind hier solche Zeiger, die keinen Wert speichern können, sondern Informationen darüber, wo eine Variable gespeichert ist. In der zweiten Zeile wird x ein Wert zugewiesen, und zwar ist der Wert die Position der Variablen a im Speicher.

Da beim Befehl "scanf" in der 4. Zeile das "&" fehlt, wird dem Befehl nicht die Position der Variablen x, sondern deren Wert übergeben. Der Wert der Variablen x ist jedoch die Position der Variablen a. Somit wird der "scanf"-Befehl hier nicht die Variable x, sondern die Variable a einlesen.

Da die Programmiersprache C keine Werte von Arrays (also. z.B. "char a[100]") bilden kann, werden bei Arrays automatisch Adressen gebildet, so dass man sich in diesem Fall das "&" sparen kann.

Ich kenne nur C, und da ist es so:

Der scanf-Befehl kann keine Daten direkt in eine Variable schreiben, er kann nur Daten an eine Speicheradresse schreiben (einen Pointer). Mit &x wird dem Programm der Pointer auf die Variable x mitgegeben,. mit dem Format-String wird scanf mitgeteilt, was für Daten dort geschrieben werden sollen.


niki308 
Beitragsersteller
 16.02.2014, 13:04

Das ist C =D

So hab ich es auch schonmal gehört ABER es funkt trotzdem alles auch wenn man das mit z.b. char bsp[80] macht deswegen hatte ich mich gewundert

0