Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » & (Adreßoperator)

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ]
000
15.08.2006, 09:34 Uhr
chessymaster



Hallo @ all,

ich bin noch ein absoluter Anfänger was das Prgrammieren angeht. Und da habe ich auch gleich ein Frage. Ich habe mir mal eine einfache Konsolenanwendung ausgedacht (Code - siehe unten), die die Anzahl der Studenten ausgibt.

Nun meine Frage zum "& (Adreßoperator)". Bei der Funktion scanf muss der Adreßoperator vor der Variable "klasse" erscheinen. Das bedeutet doch einfach nur, "Schreibe den eingebenen Wert vom Typ long auf die Variable klasse, die sich an der Stelle XXX im Arbeitsspeicher befindet." Stimmt das so????

Ich verstehe jetzt aber nicht, warum ich bei der Funktion printf den Adreßoperator vor der Variable "studentenG" weglassen muss. (wenn ich ihn nämlich doch hinschreibe, funktioniert das Programm net und ich erhalte ne Fehlermeldung.)

Warum ist das so? Warum muss das & bei scanf stehen und warum das es bei printf nicht stehen?????

Ich sagen schon einmal danke.

MfG

chessymaster

____________________________________________________
#include <stdio.h>
//const long StudentenProKlasse = 10;
#define StudentenProKlasse 10

void main ()
{

long studentenG = 0;
long klasse;

printf ("Anzahl der Klassen: ");
scanf ("%d", &klasse);

studentenG = klasse * StudentenProKlasse;

printf ("\nStudenten: %d\n", studentenG);


}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.08.2006, 10:10 Uhr
ao

(Operator)


Der Grund ist, dass scanf den Wert der Variablen klasse verändern soll, dazu ist eine sog. "call by reference"-Übergabe nötig. In C wird das über die Adressbildung realisiert.

printf erwartet die auszugebenden Variablen als "call by value"-Übergabe, das ist das Gegenstück dazu, bei dem keine Adresse gebildet wird und die gerufene Funktion die Variable nicht verändern kann.

Such einfach mal nach diesen Begriffen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.08.2006, 15:01 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.08.2006, 15:30 Uhr
xXx
Devil


Das dein Code überhaupt funktioniert ... und das ist auch nen bissel mischmasch
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.08.2006, 15:41 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Hmm,wo siehst du da mischmach ? Das Einzige,was ich auszusetzen hätte wäre das void main(),sonst nichts ...
Ach,und vielleicht long noch unsigned setzen ...
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.08.2006, 16:15 Uhr
xXx
Devil


oh sry... soll doch nen C++ Programm werden, oda?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.08.2006, 16:39 Uhr
0xdeadbeef
Gott
(Operator)


Das format flag für long ist %ld, nicht %d, und die Signatur von main ist ziemlich verkorkst, aber ansonsten sollte das funktionieren. Wahrscheinlich kaufen es einem archaische Compiler sogar so noch ab.

Naja, kurz korrigiert:

C++:
#include <stdio.h>

#define StudentenProKlasse 10

int main(void){
  long studentenG = 0;
  long klasse;

  printf ("Anzahl der Klassen: ");
  scanf ("%ld", &klasse);

  studentenG = klasse * StudentenProKlasse;

  printf ("\nStudenten: %ld\n", studentenG);

  return 0;
}


Zur Erklärung, &klasse ist die Speicheradresse, an der klasse im RAM steht. Was scanf hier im Grunde gesagt wird ist, "Lies mir ne Variable vom Typ long ein und schreib sie nach &klasse", so dass klasse nachher den eingelesenen Wert beinhaltet. Bei der Ausgabe ist das nicht mehr nötig, da reicht es auch einfach, den Wert zu übergeben - und genau das wird da auch gemacht.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 16.08.2006 um 20:45 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.08.2006, 16:40 Uhr
~chessymaster
Gast


genau c++

so ..............

warum ist "void main ()" nicht ganz ok?
und warum das long auf unsigned setzen?

fragen über fragen aber ich will es ja schließlich verstehen. daher gibts doch uach das forum, damit dinge, die man net weiß, logisch für einen werden.


have a nice day und danke an euch

chessymaster
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.08.2006, 20:00 Uhr
~chessymaster
Gast


warum am ende return 0??????????????????ßß
das programm läuft auch ohne dem.

es heißt %d für long. das ist richtig.habs von nem programmierer und der versteht sein handwerk.


warum int main(void) und net void main()
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.08.2006, 20:07 Uhr
chessymaster



"void main (void)" ist doch auch richtig. oda?
kann mir einer diese bedeutung näher bringen? was heißt das für "OTTOs"?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: