Erste Schritte mit C
-
Moin,
und zwar hab ich ein paar grundlegende Fragen. Ich muss sagen dass ich gerade erst mit C angefangen habe und mich wirkliche noch in den ersten Zügen befinde und mich zur Zeit noch mit absoluten Basics auseinandersetze.
So nun zu den Fragen:1. Wenn ich folgendes schreibe:
int k,*a;
bekomme ich eine Speicherplatz Ausgabe für k und für a erhalte ich 0 ... warum? Verweise ich mit k auf den Speicherplatz von a? Ich habe beide ja nciht definiert. Also für beide keinen Integer-Wert bestimmt.
2. Wenn ich für k die Ausgabe bekommen will, dann schreibe ich folgendes:
printf("Ausgabe k =%u\n", k);
Was hat hier das %u zu bedeuten??? Und wieso bekomme ich garkeine Ausgabe wenn ich es weglasse?
3. Ich benutzte Bloodshet - wenn ich nun eine Datei kompiliert habe und diese ausführen will, dann reicht ausführen nicht um auch die Ausgabe des Programmes zu erhalten. Wenn ich hingegen an das Ende der Klasse gehe und "Ausführen bis Cursor gehe" bekomme ich die Ausgabe - zb den Wert von k. Warum kann ich nciht einfach auf kompilieren und ausführen gehen???
Ich hoffe Ihr könnt mir helfen ,,,
Greetzkallemalle
-
1. Du erzeugst eine Variable k vom Typ "int" und a vom Typ "Zeiger auf int" - die werden beide angelegt (allerdings zeigt a ins Nirvana und k bekommt einen willkürlichen Wert*). Wo du da Speicherplatz-Ausgaben erhalten solltest, mußt du mal genauer erklären.
2. mit %... Angaben sagst du man: printf(3), daß (und wie) es die nächsten Argumente der Liste nehmen und ausgeben soll. Wenn du das weglässt, wird auch nichts ausgegeben.
(und %u steht für "vorzeichenloser Ganzzahltyp" aka "unsigned int")3. Wenn das Programm fertig abgearbeitet ist, schließt Windows sein Konsolenfenster. Was du dagegen tun kannst, steht in einem der ersten Beiträge in unserer Konsolen-FAQ.
-
CStoll schrieb:
(allerdings zeigt a ins Nirvana und k bekommt einen willkürlichen Wert*).
je nachdem wo die variablen angelegt wurden, können auch beide 0 sein. der begriff 'nirvana' steht hier für die tatsache, dass k unvorhersehbar irgendwo hin zeigen wird.
-
fussnoten-freak schrieb:
CStoll schrieb:
(allerdings zeigt a ins Nirvana und k bekommt einen willkürlichen Wert*).
je nachdem wo die variablen angelegt wurden, können auch beide 0 sein. der begriff 'nirvana' steht hier für die tatsache, dass k unvorhersehbar irgendwo hin zeigen wird.
Ups, ich wußte, ich hab was vergessen. (aber k ist kein Zeiger und zeigt deshalb nirgendwohin)
OK, dann die korrekte Fußnote:
Wenn die Variablen lokal sind, werden sie nicht (bzw. mit willkürlichen Werten) initialisiert, globale und statische Variablen werden mit 0 initialisiert.
-
CStoll schrieb:
(aber k ist kein Zeiger und zeigt deshalb nirgendwohin)
ach, 'tschuldigung. ich meinte 'a'
-
Jaaaah, soweit schonmal vielen Dank für die Antwort.
Also ... ganz hab ichs noch nciht kapiert.Deswegen nochmal zu 1.:
Also Zeiger auf int heisst, wenn ich für k einen Wert hätte, dann würde a auf den betreffenden Speicherplatz zeigen - richtig? Und k bekommt einen willkürlichen Wert? Also bei mir bekommt k den Wert: "2293640" - das sieht verdächtig nach einem Speicherplatz und nicht nach einem willkürlichen Interger Wert aus - find ich zumindest.
-
kallemalle schrieb:
1.:
Also Zeiger auf int heisst, wenn ich für k einen Wert hätte, dann würde a auf den betreffenden Speicherplatz zeigen - richtig?k und a haben nur eine gemeinsamkeit, nämlich das 'int'. ansonsten sind sie unabhängig. a ist ein zeiger auf 'int' und k ein einfacher 'int'. a muss nicht auf k zeigen, kann aber...
-
So, wie sie dort stehen, haben die beiden Variablen gar nichts miteinander zu tun. Wenn du willst, daß a auf den Speicherplatz von k zeigt, mußt du deine Variablen passend initialisieren:
int k = 0x0815, *a = &k;//jetzt hast du definierte Werte dort stehen
Und "willkürlicher Wert" kann irgendwas bedeuten - eventuell füllt der Compiler die Variablen mit einem bestimmten Bit-Muster, oder die Variable interpretiert die Daten, die vor dem Funktionsstart an der betroffenen Speicherstelle standen, passend um.
(PS: 2293640 == 0x0022FF88 - das sieht eher nach einem Dummy-Muster aus)
-
Hallo kallemalle,
ich empfehle dir, ein Einsteiger-Buch für C zu kaufen und dieses
erst einmal durchzuarbeiten, bevor du anfängst zu programmieren.Gruß mcr
-
sooo ...vielen dank für den tipp mcr ... da wär ich ncih drauf gekommen dazu was zu lesen
also zeiger auf int heisst also sowas wie. es verweist auf ein interger. wenn ich aber nicht definiert habe wodrauf dieser zeiger zeigen soll dann zeigt er ist "nirvana" also ins nix und bekommt den wert 0.
in dem skript meines professors steht außerdem, dass man auch *a = k und auch k = *a schreiben kann ... da bekomme ich aber fehlermeldungen ... kann es sein das dies nur bie c funktioniert und nichtmehr bei c++???
-
Wenn du eine Anweisung wie
k = *a
machst, dann weist du der int-Variablen k den Wert der Speicherzelle zu, auf die der int-Zeiger a verweist!
Grüße
-
kallemalle schrieb:
in dem skript meines professors steht außerdem, dass man auch *a = k und auch k = *a schreiben kann ... da bekomme ich aber fehlermeldungen ... kann es sein das dies nur bie c funktioniert und nichtmehr bei c++???
wenn a ein zeiger ist (z.b. auf int), und k eine variable (kompatibler typ, also hier int), dann sollte es gehen. in c++ kann's dir natürlich passieren, dass der *-operator überladen wurde und dann kann man für nix mehr garantieren.
-
hmmmmm...
also wenn ich in eine komplett neue datei *k = a schreibe, dann bekomme darufhin beim kompilieren eine fehlermeldung diese klasse betreffend. Wieso?
ich denke das ist so prinzipiell möglich???
-
wenn du hast:
int k,*a;
kannst du natürlich nicht schreiben
*k = a
unter anderem weil k kein pointer ist, sondern a ist der pointer. wenn du aber schreibst:
k = *a
funktioniert es. hierbei kommt in die variable k das, worauf a zeigt, oder
*a = k
hierbei kommt in die speicherzelle auf die a zeigt der wert von k.
wie sinnvoll das sein mag, sei mal dahingestellt. aber ein c-compiler sollte sich nicht beschweren.