Wie funktioniert die Funktion scanf Arbeit in C?
Warum benötigen Sie kaufmännisches und-Zeichen (&) in der scanf
Funktion. Was wird der Ausgang oder die Art der Fehler (compile-oder Laufzeit) werden in der folgenden C-code?
#include <stdio.h>
void main() {
int a;
printf("enter integer:");
scanf("%d", a);
}
- Nebenbei
main
zurückint
, nichtvoid
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
&
in C ein operator ist, gibt die Adresse des Operanden. Denken Sie an es auf diese Weise, wenn Sie geben einfachscanf
die variablea
ohne die&
ist, wird es an es übergeben werden, indem-Wert, was bedeutet, dassscanf
wird nicht in der Lage sein, Ihren Wert für Sie zu sehen. Übergabe per Referenz (using&
tatsächlich übergibt einen Zeiger aufa
) ermöglichtscanf
es so eingerichtet, dass der Aufruf von Funktionen, die Veränderung sehen, die auch.In Bezug auf die spezifischen Fehler, kann man nicht wirklich sagen. Das Verhalten ist undefiniert. Manchmal könnte es stillschweigend weiter laufen, ohne dass Sie wissen
scanf
verändert einige Werte, die irgendwo in Ihrem Programm. Manchmal wird das Programm Abstürzen, sofort, wie in diesem Fall:Kompilieren zeigt er das an:
Und die Ausführung zeigt einen segmentation fault:
In C, alle Funktions-Argumente als Wert übergeben werden; änderungen an der Funktion formale parameter sind, spiegelt sich nicht in der tatsächlichen parameter. Zum Beispiel:
Die Ausgabe des Programms wird
weil
bar
erhält den Wertx
(0), nicht eine Referenz aufx
selbst. Ändernbar
hat keine Auswirkungen aufx
.In C, der Weg, um dieses ist zum übergeben eines Zeiger zu einer variable:
Nun die Ausgabe des Programms ist
Dieser Zeit werden die formalen parameter
bar
ist nicht eine int, aber eine Zeiger int, und es erhält die Adresse vonx
(gegeben durch den Ausdruck&x
im Aufruffoo
), nicht die enthaltenen Wert in x. Der Ausdruck*bar
Mittel ", um den Wert in der Adressleiste Punkte zu", so*bar = *bar + 1
entsprichtx = x + 1
.Seit
scanf()
schreiben muss, um seine Argumente, es erwartet, dass diese Argumente nicht zu toppen als Zeiger. Die "%d" umwandlungsspezifikator erwartet, dass das zugehörige argument ein Zeiger auf int (int *
), die "%u" umwandlungsspezifikator erwartet einen Zeiger auf unsigned int (unsigned *
), "%s" erwartet einen Zeiger auf char (char *
), "%f" erwartet einen Zeiger auf float (float *
), etc. In deinem Beispiel, daa
eingegeben wirdint
benutzen, brauchen Sie den Ausdruck&a
einen Zeiger.Beachten Sie, dass, wenn
a
waren bereits ein pointer-Typ, würden Sie nicht brauchen, um verwenden Sie die&
Betreiber im Aufrufscanf()
:Beachten Sie auch, dass bei der übergabe eines Arrays an eine Funktion (wie bei der Verwendung der "%s" umwandlungsspezifikator zu Lesen, dass ein string), die Sie nicht brauchen, um verwenden Sie die
&
operator; die array-Ausdrucks implizit umgewandelt werden in ein Zeiger-Typ:Wenn Sie Fragen, eine Frage wie diese, würde ich empfehlen, nur zu lernen, für jetzt "es funktioniert einfach".
Erfahren Sie, dass müssen Sie ein kaufmännisches und-Zeichen, weil
scanf
nimmt eine oder mehrere pointer-Argumente. Wenn a eine int-variable ist, ist es nicht ein Zeiger. &a ("Adresse von a") ist ein Zeiger, so funktioniert es mitscanf
.Dies ist, weil in C, Funktionen Parameter sind durch Wert übergeben. Um für die
scanf()
- Funktion zum ändern der 'a
' - variable in der main () - Funktion, die Adresse von 'a
' zuteil werden sollscanf()
, damit die Nutzung des et-Zeichens (Adresse).Weil
scanf
erfordert ein Zeiger auf die variable (also eine Referenz), dass der Wert in.Du nicht immer benutzen müssen
&
mitscanf
. Was Sie tun müssen, ist zu gehen Zeiger. Wenn Sie neu in C, sollten Sie verbringen einige Zeit mit dem Lesen der comp.lang.c FAQ:http://c-faq.com/
Speziell:
Dem '&' in
scanf
ist nur erforderlich, um die Adresse einer Variablen. Sie kann Verwendungscanf
ohne '&' durch verwenden von Zeigern:Im Allgemeinen mit '&' ist oft einfacher als das erstellen Zeiger zu vermeiden, die mit dem '&'.