Zeiger ?
-
int x, *y,
char c, z[ ]="text";d) y = z;
Geht das? Nein, oder? da Zeiger und (hier) Array doch vom gleichen Typ sein müssen oder ist das egal?
Gruß juniorcrew
-
du hast doch einen compiler oder? dann probier es doch einfach mal aus das geht sogar schneller als es hier zu posten und auf ne antwort zu warten
lg lolo
-
da der letzte post nicht sonderlich hilfreich war, es geht, du mußt aber casten und greifst dann auf alle 4 buchstaben auf einmal zu
das erklärt dir aber jeder compiler und debugger, probleme bekommst du erst wenn du versuchst auf das '\0' zuzugreifen, aber das ist jetzt mal ein anderes thema
lg lolo
-
Geht!
Aber der Compiler gibt eine Warnung raus. Aber es funzt erstmal. Gut muss ich mir einfac mal merken.
Danke!
-
in der warnung des compilers steht doch schon fast wie man die entfernen kann oder?
lg lolo
-
Hallo,
Lese die Warnung und versuche sie zu verstehen!! Imho, zu verstehen was hier genau stattfindet, ist eines der grundsaetzlichsten Probleme am Anfang bei C.
Mein Compiler gibt hier bspw. folgendes aus:warning: assignment makes integer from pointer without a cast
Was heisst das? Es gibt grundsaetzlich sowas wie "Werte" und "Speicheradressen". In der Regel wirst Du Variablen (=Werte Behaelter) anderen Variablen (in andere Werte Behaelter) zuweisen. Du kannst auch eine Adresse einem Wert zuweisen, aber das ist eher exotischer.
Die Gefahr ist deshalb eher, dass Du einen Zeiger hast, dessen Inhalt (Wert) Du zwar einem Wert zuweisen willst, aber Du hast das '*' vergessen. Das Resultat kompiliert zwar auch, aber anstatt des Zeigerinhaltes, werden nun "Hausnummern" (=Speicheradressen) zugewiesen und irgendwo ganz woanderst tritt (wahrscheinlich) damit ein Problem auf. Herauszufinden, wo die "falsche" Zuweisung stattgefunden hat, kann sehr unterhaltend sein, v.a. wenn etwa gleich mehrere Threads fuer die faelschliche Zuweisung in Frage kommen koennen, etc. Du weist also hier v.a. einen "Adressentyp" (die Adresse des Zeigers) zu einem "Werttyp" (der int Variable).Generell solltest Du IMMER versuchen Warnungen zu beheben, nur so koennen Dir Warnungen helfen tiefere Fehler zu entdecken. Dh. willst Du wirklich die Adresse des char Zeigers speichern, dann caste sie auf den int (und nimm vllt gleich lieber long long int):
long long int z; char p[]="asdf"; z = (long long int) p;
Willst Du aber den "Wert" (einen char) in die int Variable schreiben, dann nimm einen '*':
int z; char p[]="asdf"; z = *p;
Die implizit stattfindenden Konvertierung von char (1 byte) auf int (idR 4 byte) macht keine Probleme, weil vergroessert wird. Wuerdest Du von int auf char zuweisen, gaebs eine andere Warnung, dass evtl 3 byte abgeschnitten werden. Auch hier gilt, willst Du dies explizit machen: caste!
Es geht also nicht einfach darum "das weg zu machen", sondern man hat hier 2 unterschiedliche Moeglichkeiten und sollte im Code explizit sagen was man will!
-
Erlaeuterer schrieb:
... dann caste sie auf den int (und nimm vllt gleich lieber long long int):
long long int z; char p[]="asdf"; z = (long long int) p;
Bist Du auf crystal meth? Das einzig sinnvolle Format, einen Pointer formatfrei "mal so" aufzuheben, ist ein void *, kann man immer noch zur Ausgabe usw. casten. Aber so kriminelles Zeug einem Newbie hinzustreuseln, halte ich für keine gute Idee ...
(long long int) p
-
Erlaeuterer schrieb:
... willst Du wirklich die Adresse des char Zeigers speichern, dann caste sie auf den int (und nimm vllt gleich lieber long long int)
...schau dir mal
intptr_t uintptr_t
als datentypen an die sind für pointer gedacht und haben immer die richtige größe (sind in <stdint.h> definiert)
lg lolo
-
hab das gerade nochmal nachgeblättert, scheint so als wären die dinger optional, und es existiert laut c99 nur "ptrdiff_t" als gültiger typ
bin mir jetzt auch nicht sicher ob die differenz zweier pointer die selbe größe hat wie ein pointer, sollte aber eigentlich schon so sein, daher könnte man fast sagen das man statt "intptr_t" und "uintptr_t" immer "ptrdiff_t" verwenden sollte, aber so ganz schlau bin ich aus dem text doch noch nicht geworden und evtl. steht auch paar seiten drüber oder drunter das doch alles wieder ganz anders ist
-
LOL, klar, aber weisst Du was er als naechstes macht? Ich wette auf printf(), und
mit %ld geht's dann wenigstens gleich - bzw. war ich deswegen jetz nur etwas
pragmatischer. Dass es so ca eine-million-und-siebzehn verschiedene typedefs fuer
"int" gibt in C, braucht ihn ja am Anfang noch gar nicht zu interessieren.(Genauso wenig uebrigens, wie dass C Programmierer zuweilen recht pedantisch sein
koennen,... sogar fast so schlimm wie C++ Programmierer! *duck* ).
-
... sogar fast so schlimm wie C++ Programmierer! *duck*
ach du meinst die, die gelegentlich aus einer list das x.te element ansprechen und sich dann fragen wieso das langsamer ist als in einem statischen array