Variable/Adresse der Variable

  • Themenstarter Themenstarter ByeBye 249714
  • Beginndatum Beginndatum
B

ByeBye 249714

Hallo,
ich habe folgende Frage...

wenn ich im main-block folgendes stehen habe:

..
int zahl;
scanf("%i",&zahl);
..

bedeutet dies doch folgendes, oder?: Die Zahl, die man eingibt, ist vom Typ Integer und... ,jetzt bin ich mir unsicher - das "&" bedeutet doch, dass die Adresse von "zahl" gemeint ist? -, wird in die Adresse von "zahl" gespeichert. Aber die Adresse von "zahl" ist doch die Angabe des Speicherplatzes im Arbeitsspeicher... also 0xusw, oder? Müsste es nicht
"scanf("%i",zahl); heißen? Die eingegeben Zahl soll doch in "zahl" gespeichert werden, und nicht in dessen Adresse.
 
Hallo Quwerfeldein

Bezüglich des &-Operators in diesem Kontext hast du recht. Du übergibst als Parameter an scanf die Adresse der Variable zahl.

Warum ist dies nötig? Bei Funktionsaufrufen werden ja die Parameter, welche du übergibst in die lokalen Parameterobjekte der Funktion kopiert. Würde jetzt scanf einfach eine Kopie des Inhalts von zahl übergeben bekommen so könnte die Funktion natürlich in diese Kopie schreiben, aber auf "zahl" hat das überhaupt keinen Einfluss, es handelt sich ja nur um eine Kopie.

Erhälst jetzt scanf aber eine Kopie der Adresse von zahl, so kann die Funktion an der Stelle, auf die diese Adresse zeigt etwas reinschreiben (das ist ja im Endeffekt der Ort an dem sich unsere Variable zahl befindet) und somit zahl auch aktiv beeinflussen.

Gruss
Cromon
 
Bei Funktionsaufrufen werden ja die Parameter, welche du übergibst in die lokalen Parameterobjekte der Funktion kopiert. Würde jetzt scanf einfach eine Kopie des Inhalts von zahl übergeben bekommen so könnte die Funktion natürlich in diese Kopie schreiben, aber auf "zahl" hat das überhaupt keinen Einfluss, es handelt sich ja nur um eine Kopie.
Hm, ok, die Idee davon habe ich glaub ich prinzipiell verstanden. D.h. scanf ist selbst eine Funktion, in der für sich (also in dem kurzen Statement) zahl==z.B. 4 ist; aber wenn ich sie mit printf auslesen will, greift print f auf die globale Variable zurück.?

Das hier erscheint mir noch nicht ganz klar:

Erhälst jetzt scanf aber eine Kopie der Adresse von zahl, so kann die Funktion an der Stelle, auf die diese Adresse zeigt etwas reinschreiben (das ist ja im Endeffekt der Ort an dem sich unsere Variable zahl befindet) und somit zahl auch aktiv beeinflussen.
D.h., ich formuliere es noch einmal um richtig zu gehen es verstanden zu haben, mit &zahl wird nicht die Adresse von zahl verändert, sondern: &zahl ist vielmehr ein Zeiger, zeigt also auf die Adresse der glob. Variable, um dann dort den integerWert abzuspeichern.

Was wäre denn wenn ich && schreibe? würde ich dann die Adresse verändern? Also den Ort im RAM wo der Wert von zahl hinterlegt ist.
 
Vielleicht nocheinmal anders erklärt:
Bei Parametern wird generell immer eine KOPIE des Werts übergeben

Dh, wenn du scanf ohne dem & aufrufst (und scanf auch entsprechend programmiert wäre), wäre das ca. folgender Ablauf:
-Du rufst scanf("%i",zahl); auf
-Das Programm legt (ohne das du davon was merkst) eine neue int-Variable an, ich nenn sie mal kopie
-kopie bekommt den Wert von zahl, also einfach "kopie=zahl;"
-scanf liest von der Tastatur was ein und speichert es in kopie
-scanf ist fertig, kopie wird wieder gelöscht.
-In zahl steht noch immer der Wert, der vor scanf drin war. Deine Tastatureingabe ist weg.

In Wirklichkeit ist scanf aber so programmiert, dass es eine Adresse erwartet.
Wenn du wirklich &zahl übergibst, wäre das:
-Du rufst scanf("%i",&zahl); auf
-Das Programm legt (ohne das du davon was merkst) eine neue int-Variable an, ich nenn sie mal kopie
-kopie bekommt die Adresse von zahl, also "kopie=&zahl;"
-scanf liest von der Tastatur was ein, schaut nach welche Adresse in kopie steht und speichert das Eingelesene an diese Adresse im Arbeitspeicher
-scanf ist fertig, kopie (mit der Adresse von zahl als Wert) wird wieder gelöscht.
-In zahl steht jetz der eingelesene Wert. OK.


Wenn du jetzt dieses Adress-erwartende scanf ohne & aufrufst
(Angenommen, vor scanf steht in zahl zB 4 drin)
-Du rufst scanf("%i",zahl); auf
-Das Programm legt (ohne das du davon was merkst) eine neue int-Variable an, ich nenn sie mal kopie
-kopie bekommt den Wert von zahl, also "kopie=zahl;"
-scanf liest von der Tastatur was ein, schaut nach welche Adresse in kopie steht und speichert das Eingelesene an diese Adresse im Arbeitspeicher. Also beim vierten Byte.
-scanf ist fertig, kopie (mit der Adresse von zahl als Wert) wird wieder gelöscht.
-Beim vierten Byte deines Arbeitsspeichers steht die Eingabe; was vorher drin war ist weg.
Bestenfalls bekommst du einen Absturz.

Für den letzten Fall gibts aber vom Betriebssystem eine Sicherung, die verhindert, dass du Adressen überschreibst, die nicht zu dienen Variablen/zu deinem Programm gehören.
Bei 4 würde dein Programm immer abstürzen, weil das Betriebssystem da was dagegen hat.
Man bekommt dann halt keine freundliche Meldung, einfacher gehts das Programm zu killen :D

Was printf angeht: printf soll den Inhalt der Variablen ja nur ausgeben und daran nichts verändern.
Also reichen ihm Auch die kopie-Werte, die Adressen interressieren die Funktion nicht.
Deshalb auch kein & bei printf.

Zu dem doppelten &&: Theoretisch hast du recht, aber an welche Adressen deine Variablen kommen entscheidet das Betriebssystem. Da hast du selber keinen Einfluss drauf.
 
D.h. scanf ist selbst eine Funktion, in der für sich (also in dem kurzen Statement) zahl==z.B. 4 ist; aber wenn ich sie mit printf auslesen will, greift print f auf die globale Variable zurück.?
Das verstehe ich nicht ganz, was du da meinst. scanf schreibt einen Wert in die Adresse des Parameters (spricht, zahl wohnt in Musterstraße1, scanf ändert nichts an der Adresse, stellt aber ein anderes Haus hin), printf wiederum gibt das "Haus" aus, die Straße kannst du dir auch ausgeben lassen, hier ein kleines Programm:
Code:
#include <iostream>

using namespace std;

int main()
{
   int zahl;
   printf("%s", "Geben Sie eine Zahl ein: ");
   scanf("%i", &zahl);
   printf("Wert: \t\t %i \n", zahl); //Haus
   printf("Adresse: \t %p", (void *)&zahl); //Straße
}


Gruß,

badday
 
An badday: Das von dir zitierte bezog sich auf meine Vermutung wie es für scanf("%i",zahl); ablaufen könnte. Sheel hat es ja richtiggestellt. Danke für dein Beispiel und an alle für die ausführlichen und freundlichen Antworten. :)
 
Zurück