Hallo,
Ich habe eine Frage zum Adressoperator in C.:
Beispiel:
#include
On Sun, 18 May 2003 at 13:31 (+0200), Daniel Feist wrote:
Hallo, Ich habe eine Frage zum Adressoperator in C.: Beispiel:
#include
/* Bibliothek einbinden */ int main() { int i; /* Variable "i" festlegen */
printf("Bitte geben sie eine Zahl ein: ");
scanf("%d", &i); /* Standarteingebe stdin mit "%d" festlegen und Variabele &i als Adressoperator bestimmen */
printf("Die Zahl, die sie eingegeben haben ist: "%d", i); /* Ich verstehe nicht, warum statt '&i' nur 'i' dasteht, obwohl der die Standarteingabe noch in "&i" abgeleg ist.
return 0; }
Bei scanf() wird was eingelesen, d. h. scanf will den Wert von i veraendern. Dies geht nur, wenn scanf() die Adresse von i uebergeben wird. Man kann sich das so vorstellen: i uebergibt einer Funktion die Zahl, &i uebergibt einen Zettel, auf der die Zahl draufsteht. Wenn Du einen Zettel uebergibst, kann die Funktion einen Radiergummi nehmen und was anderen auf den Zettel schreiben. Dann hat das Hauptprogramm, wo die Funktion aufgerufen wird, den anderen Wert in i stehen. Wenn Du aber nur i uebergibst, kann i nicht veraendert werden. printf() muss nichts veraendern, es braucht einfach nur den Wert. printf("%d\n", 5); geht, es wird einfach 5 ausgegeben. scanf("%d", 5) geht nicht, wie soll 5 denn veraendert werden. &5 geht natuerlich auch nicht, weil man von einer Zahlenkonstante keine Adresse uebergeben kann. Trotzdem rate ich Dir dringend, ein gutes C-Buch zu kaufen, in dem sowas erklaert wird. Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ "Der Mensch erfand die Atombombe, doch keine Maus der Welt würde eine Mausefalle konstruieren." -- Albert Einstein
On Sun, 18 May 2003, Bernhard Walle wrote:
On Sun, 18 May 2003 at 13:31 (+0200), Daniel Feist wrote:
Hallo, Ich habe eine Frage zum Adressoperator in C.: Beispiel:
#include
/* Bibliothek einbinden */ int main() { int i; /* Variable "i" festlegen */
printf("Bitte geben sie eine Zahl ein: ");
scanf("%d", &i); /* Standarteingebe stdin mit "%d" festlegen und Variabele &i als Adressoperator bestimmen */
printf("Die Zahl, die sie eingegeben haben ist: "%d", i); /* Ich verstehe nicht, warum statt '&i' nur 'i' dasteht, obwohl der die Standarteingabe noch in "&i" abgeleg ist.
return 0; }
Bei scanf() wird was eingelesen, d. h. scanf will den Wert von i veraendern. Dies geht nur, wenn scanf() die Adresse von i uebergeben wird.
Die Adresse von 'i' wird ja einfach willkürlich vom Computer festgelegt. Wenn ich das richtig verstanden habe, wird durch &(Adressoperator) die Adresse festgelegt!
Man kann sich das so vorstellen: i uebergibt einer Funktion die Zahl,&i uebergibt einen Zettel, auf der die Zahl draufsteht. Wenn Du einen Zettel uebergibst, kann die Funktion einen Radiergummi nehmen und was anderen auf den Zettel schreiben. Dann hat das Hauptprogramm, wo die Funktion aufgerufen wird, den anderen Wert in i stehen. Wenn Du aber nur i uebergibst, kann i nicht veraendert werden. printf() muss nichts veraendern, es braucht einfach nur den Wert.
printf("%d\n", 5); geht, es wird einfach 5 ausgegeben. scanf("%d", 5) geht nicht, wie soll 5 denn veraendert werden. &5 geht natuerlich auch nicht, weil man von einer Zahlenkonstante keine Adresse uebergeben kann.
Hä?!? Wie 'i' übergibt einer Funktion die Zahl,... das ist mir nicht klar! Aber sonst hast du es gut beschrieben.
Trotzdem rate ich Dir dringend, ein gutes C-Buch zu kaufen, in dem sowas erklaert wird.
Ich lese ja momentan auf www.pronix.de eine Einführung in C - Aber ich werde mir sowiso ein Buch kaufen - kennst du ein gute?
Um die Liste abzubestellen, schicken Sie eine Mail an: suse-programming-unsubscribe@suse.com Um eine Liste aller verfügbaren Kommandos zu bekommen, schicken Sie eine Mail an: suse-programming-help@suse.com
Gruss Daniel -- clusterix.perl@gmx.de
On Sun, 18 May 2003 at 18:44 (+0200), Daniel Feist wrote:
On Sun, 18 May 2003, Bernhard Walle wrote:
On Sun, 18 May 2003 at 13:31 (+0200), Daniel Feist wrote:
Hallo, Ich habe eine Frage zum Adressoperator in C.: Beispiel:
#include
/* Bibliothek einbinden */ int main() { int i; /* Variable "i" festlegen */
printf("Bitte geben sie eine Zahl ein: ");
scanf("%d", &i); /* Standarteingebe stdin mit "%d" festlegen und Variabele &i als Adressoperator bestimmen */
printf("Die Zahl, die sie eingegeben haben ist: "%d", i); /* Ich verstehe nicht, warum statt '&i' nur 'i' dasteht, obwohl der die Standarteingabe noch in "&i" abgeleg ist.
return 0; }
Bei scanf() wird was eingelesen, d. h. scanf will den Wert von i veraendern. Dies geht nur, wenn scanf() die Adresse von i uebergeben wird.
Die Adresse von 'i' wird ja einfach willkürlich vom Computer festgelegt. Wenn ich das richtig verstanden habe, wird durch &(Adressoperator) die Adresse festgelegt!
Sie wird beim Kompilieren festgelegt, wenn sie, wie i auf dem Stack liegt. i gibt die Adresse zurueck. Du hast als Programmierer keinen Einfluss auf die Adresse von i.
Man kann sich das so vorstellen: i uebergibt einer Funktion die Zahl,&i uebergibt einen Zettel, auf der die Zahl draufsteht. Wenn Du einen Zettel uebergibst, kann die Funktion einen Radiergummi nehmen und was anderen auf den Zettel schreiben. Dann hat das Hauptprogramm, wo die Funktion aufgerufen wird, den anderen Wert in i stehen. Wenn Du aber nur i uebergibst, kann i nicht veraendert werden. printf() muss nichts veraendern, es braucht einfach nur den Wert.
printf("%d\n", 5); geht, es wird einfach 5 ausgegeben. scanf("%d", 5) geht nicht, wie soll 5 denn veraendert werden. &5 geht natuerlich auch nicht, weil man von einer Zahlenkonstante keine Adresse uebergeben kann.
Hä?!? Wie 'i' übergibt einer Funktion die Zahl,... das ist mir nicht klar! Aber sonst hast du es gut beschrieben.
i ist ein Ausdruck, der eine Zahl zum Ergebnis hat. Fuer die Funktion ist es egal ob Du nun den Wert von i direkt hinschreibst oder ueber eine Variable uebergibst. Wohlgemerkt, nur fuer die aufgerufene Funktion.
Trotzdem rate ich Dir dringend, ein gutes C-Buch zu kaufen, in dem sowas erklaert wird.
Ich lese ja momentan auf www.pronix.de eine Einführung in C - Aber ich werde mir sowiso ein Buch kaufen - kennst du ein gute?
Ich hab C mit "C fuer Linux in 21 Tagen" gelernt, das Buch ist nicht schlecht. Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Jeder dumme Junge kann einen Käfer zertreten. Aber alle Professoren der Welt können keinen herstellen. -- Arthur Schopenhauer
Hi Daniel, also es ist so: Mit "int i;" wird eine neue Variable angelegt vom Typ integer. Wenn Du nun diese Variable belegst, gibst du an: i=1; Nun wurde i mit dem Wert 1 belegt. i enthält jetzt den Wert 1. &i hingegen enthält die Adresse, wo i im Speicher liegt. Wenn Du nun möchtest, dass eine Funktion wie eben scanf den Wert einer Variablen ändert kannst Du ihr nicht einfach die Variable geben. Beispiel: function(i); würde heißen, dass Du i an die function übergibst. Also den Wert 1. Rufst Du stattdessen function(&i) auf, übergibst Du nicht mehr den Wert 1, sondern die Adresse wo dieses i mit dem Wert 1 im Speicher liegt. Im Falle von scanf wird ja nicht einfach nur der Wert i übergeben, damit scanf damit arbeiten kann. Es soll ja i geändert werden. Damit scanf das kann, muss es aber wissen, wo dieses i im Speicher liegt. Deshalb übergibst Du scanf die Adresse von i, mittels &i. Wenn scanf nun diesen Speicher verändert, sind die Änderungen logischerweise auch wieder im Hauptprogramm verfügbar. Mike
Moin,
* Daniel Feist
Die Adresse von 'i' wird ja einfach willkürlich vom Computer festgelegt. Wenn ich das richtig verstanden habe, wird durch &(Adressoperator) die Adresse festgelegt!
Der Audruck 'i' hat einen bestimmten Wert. Beispiel: int i = 0; Jetzt hat der Audruck 'i' den Wert '0'. Der Ausdruck '&i' hat ebenfalls einen Wert, nämlich den Wert 'Adresse, an der die Variable i gespeichert ist'. Der Funktion übergibst Du den Ausdruck, also in meinem Beispiel entweder '0' oder 'Adresse, an der ...'. Mit dem ersten Wert kann die Funktion nichts anfangen, weil sie einen Platz braucht, an den das Ergebnis geschrieben werden soll.
Man kann sich das so vorstellen: i uebergibt einer Funktion die Zahl,&i uebergibt einen Zettel, auf der die Zahl draufsteht. Wenn Du einen Zettel uebergibst, kann die Funktion einen Radiergummi nehmen und was anderen auf den Zettel schreiben. Dann hat das Hauptprogramm, wo die Funktion aufgerufen wird, den anderen Wert in i stehen. Wenn Du aber nur i uebergibst, kann i nicht veraendert werden. printf() muss nichts veraendern, es braucht einfach nur den Wert.
printf("%d\n", 5); geht, es wird einfach 5 ausgegeben. scanf("%d", 5) geht nicht, wie soll 5 denn veraendert werden. &5 geht natuerlich auch nicht, weil man von einer Zahlenkonstante keine Adresse uebergeben kann.
Hä?!? Wie 'i' übergibt einer Funktion die Zahl,... das ist mir nicht klar!
Siehe oben, der Ausdruck 'i' hat den Wert 5 oder 0 oder einen anderen Integer. Dieser Wert wird übergeben.
Trotzdem rate ich Dir dringend, ein gutes C-Buch zu kaufen, in dem sowas erklaert wird.
Ich lese ja momentan auf www.pronix.de eine Einführung in C - Aber ich werde mir sowiso ein Buch kaufen - kennst du ein gute?
Ich hatte einen guten Lehrer, aber im Allgemeinen wird das Original von Kernighan und Ritchie empfohlen. Thorsten -- I say, if your knees aren't green by the end of the day, you ought to seriously re-examine your life. - Calvin
Hallo, On Sun, 18 May 2003, Thorsten Haude wrote:
* Daniel Feist
[2003-05-18 18:44]: [..] Ich lese ja momentan auf www.pronix.de eine Einführung in C - Aber ich werde mir sowiso ein Buch kaufen - kennst du ein gute?
Ich hatte einen guten Lehrer, aber im Allgemeinen wird das Original von Kernighan und Ritchie empfohlen.
Der Empfehlung kann ich mich anschliessen, ich fand den K&R recht gut lesbar -- ich kenne allerdings nicht die deutsche Uebersetzung ;) -dnh --
All programs evolve until they can send email. Except Microsoft Exchange. -- Richard Letts, Art
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
- - ----- Original Message -----
From: "Daniel Feist"
participants (6)
-
Bernhard Walle
-
Daniel Feist
-
David Haller
-
Michael Gebhart
-
Skyman
-
Thorsten Haude