Zeiger



  • zeigefinger-fan schrieb:

    nein, eine adresse ist eine eindeutige 'nummer' für einen speicherplatz. ein zeiger ist eine variable, die eine adresse speichern kann/soll.
    🙂

    LordJaxom schrieb:

    Genauer: Der Typ einer Adresse (&variable) ist immer "Zeiger auf Typ von 'variable'".



  • LordJaxom schrieb:

    LordJaxom schrieb:

    Genauer: Der Typ einer Adresse (&variable) ist immer "Zeiger auf Typ von 'variable'".

    das ist ja noch verkehrter.
    🙂



  • Wenn du nichts konstruktives beitragen kannst, dann sei lieber ruhig 😉 (und anstelle eines einfachen "das ist noch verkehrter" solltest du uns lieber erklären, wie es richtig ist - aber das kann man ja von unser aller Lieblings-*** nicht erwarten)



  • CStoll schrieb:

    aber das kann man ja von unser aller Lieblings-*** nicht erwarten)

    die antwort will dir dein lieblingstroll nicht schuldig bleiben. der satz: Der Typ einer Adresse (&variable) ist immer "Zeiger auf Typ von 'variable'". zeigt deutlich, dass selbst user mit über 1000 beiträgen lückenhaftes grundlagenwissen haben oder vielleicht mal den dealer wechseln sollten.

    Der Typ einer Adresse (&variable)...
    die adresse hat keinen typ, sondern die variable hat einen typ. bei der zuweisung der adresse einer variablen an einen pointer z.b. *int a; int p=&a; beachtet der compiler, dass typ der variablen und typ des pointers kompatibel sind. eine adresse allein ist nur eine nummer.

    ...ist immer "Zeiger auf Typ von 'variable'".
    eine adresse ist kein zeiger (das schrieb ich bereits) und weder zeiger noch adresse zeigen auf 'typ von variable', sondern auf 'variable vom typ int o.ä.'. auf einen typen kann man nicht zeigen (höchstens mit dem finger, weil er solchen blödsinn schreibt).
    🙂



  • pedantic-freak schrieb:

    Der Typ einer Adresse (&variable)...
    die adresse hat keinen typ, sondern die variable hat einen typ. bei der zuweisung der adresse einer variablen an einen pointer z.b. *int a; int p=&a; beachtet der compiler, dass typ der variablen und typ des pointers kompatibel sind. eine adresse allein ist nur eine nummer.

    Jeder Wert hat einen Typ, nicht nur namentlich benannte Variablen (das schließt auch Literale wie 123 (Typ: int) oder 3.14 (Typ: double) und temporäre Werte wie den Rückgabewert des Adressoperators &ival (Typ: int* - Zeiger auf int) mit ein).

    ...ist immer "Zeiger auf Typ von 'variable'".
    eine adresse ist kein zeiger (das schrieb ich bereits) und weder zeiger noch adresse zeigen auf 'typ von variable', sondern auf 'variable vom typ int o.ä.'. auf einen typen kann man nicht zeigen (höchstens mit dem finger, weil er solchen blödsinn schreibt).
    🙂

    Eine Adresse ist ein Wert - und hat als solche auch einen eigenen Typ, nämlich "Zeiger auf typ_x" (wobei typ_x der Typ der Variable ist, deren Adresse du genommen hast).

    PS: Wer hier "den Dealer wechseln sollte", bleibt abzuwarten.



  • Dass er nicht sonderlich viel Ahnung von dieser Materie hat, weiss man (ich zumindest) seit dem Thread: http://www.c-plusplus.net/forum/viewtopic-var-t-is-198663-and-start-is-0.html



  • pedantic-freak schrieb:

    eine adresse ist kein zeiger (das schrieb ich bereits) und weder zeiger noch adresse zeigen auf 'typ von variable', sondern auf 'variable vom typ int o.ä.'. auf einen typen kann man nicht zeigen (höchstens mit dem finger, weil er solchen blödsinn schreibt).
    🙂

    Es zeigt auch nichts auf einen Typ, es war "Zeiger auf <den Typ von 'variable' (aus dem Beispiel) bitte an dieser Stelle im Text einsetzen, danke>" gemeint. Ich habe anscheinend für Dich nur zuwenige Zitat- und Klammersymbole verwendet.

    Dennoch brauchst Du trotz aller Differenzen und Nickeligkeiten nicht beleidigend, ausfallend oder verleumdend werden.



  • CStoll schrieb:

    Eine Adresse ist ein Wert - und hat als solche auch einen eigenen Typ, nämlich "Zeiger auf typ_x" (wobei typ_x der Typ der Variable ist, deren Adresse du genommen hast).

    nein, eine nackte adresse hat bestenfalls den typ 'vorzeichenlose ganzzahl' und ist erstmal kein zeiger. beispiel:

    int *p = (int*)0x1234;
    

    rechts der wert 0x1234 ist eine 'adresse', es ist kein pointer. durch den cast wird dem compiler gesagt, dass diese zahl die adresse von einem 'int' ist, und deshalb erlaubt er die zuweisung an den pointer.
    oder sowas:

    int a = *(int*)0x1234;
    

    hierbei wird die adresse als 'int*' interpretiert, damit ein 'int'-wert ausgelesen werden kann, ganz ohne einen pointer.
    🙂



  • Tim schrieb:

    Dass er nicht sonderlich viel Ahnung von dieser Materie hat, weiss man (ich zumindest) seit dem Thread:

    hast du nicht gelesen (mein letzter beitrag in diesem thread), dass ich dich missverstanden hatte?
    🙂



  • addressdecoder-freak schrieb:

    nein, eine nackte adresse hat bestenfalls den typ 'vorzeichenlose ganzzahl' und ist erstmal kein zeiger. beispiel:

    int *p = (int*)0x1234;
    

    rechts der wert 0x1234 ist eine 'adresse', es ist kein pointer. durch den cast wird dem compiler gesagt, dass diese zahl die adresse von einem 'int' ist, und deshalb erlaubt er die zuweisung an den pointer.

    Nein, der Wert 0x1234 ist (aus Sicht des Compilers und C-Programmierers - für Assembler-Programmierer sieht das vermutlich etwas anders aus) keine Adresse, sondern eine Zahl (Typ: int). Erst durch den Cast erklärst du dem Compiler, daß du diese Zahl gerne als Adresse verwenden willst.

    Ja, ich weiß, für den PC sind das alles nur noch Bits und Bytes, aber auf dieser Ebene existieren auch keine "Typen" mehr - der Compiler steht eine Ebene weiter oben und kennt noch den Unterschied zwischen einem Zeiger und einer Zahl (zumindest solange, wie du ihm nicht mit expliziten Casts das Gegenteil erklären willst).



  • addressdecoder-freak schrieb:

    nein, eine nackte adresse hat bestenfalls den typ 'vorzeichenlose ganzzahl' und ist erstmal kein zeiger. beispiel:

    int *p = (int*)0x1234;
    

    rechts der wert 0x1234 ist eine 'adresse', es ist kein pointer. durch den cast wird dem compiler gesagt, dass diese zahl die adresse von einem 'int' ist, und deshalb erlaubt er die zuweisung an den pointer.
    oder sowas:

    int a = *(int*)0x1234;
    

    hierbei wird die adresse als 'int*' interpretiert, damit ein 'int'-wert ausgelesen werden kann, ganz ohne einen pointer.
    🙂

    nop, da widerspreche ich dir.

    siehe

    int var; 
    if(&var == 0xdeadbeef);
    

    gcc sagt:

    b.c:4: warning: comparison between pointer and integer
    

    also ist eine nackte Adresse (&var) kein unsigned int, während 0xdeadbeef keine Adresse ist sondern ein normales int ist.

    //edit: ups, CStoll war ein bisschen schneller 🙂



  • Preisfrage: Was ist 0xdeadbull? 🤡



  • Tim schrieb:

    Preisfrage: Was ist 0xdeadbull? 🤡

    (unsigned long long)912091
    🙂



  • LordJaxom schrieb:

    Dennoch brauchst Du trotz aller Differenzen und Nickeligkeiten nicht beleidigend, ausfallend oder verleumdend werden.

    tut mir aufrichtig leid, ich habe mal wieder viel zu schnell in die tasten gehauen. war nicht böse gemeint. ich entschuldige mich hiermit, nehme den 'dealer' zurück und bitte um vergebung.
    🙂



  • Jetzt habt ihr mich erfolgreich verwirrt. 😮 Also ist eine mit "&" gewonnene Adresse typisiert als Pointer.

    int var; 
    if(&var == (void *) 0xdeadbeef);
    

    Das geht nämlich, aber vergleiche ich wirklich, ob var an Speicheradresse $deadbeef liegt 😕



  • pointercrash() schrieb:

    Also ist eine mit "&" gewonnene Adresse typisiert als Pointer.

    ja.

    pointercrash() schrieb:

    int var; 
    if(&var == (void *) 0xdeadbeef);
    

    Das geht nämlich, aber vergleiche ich wirklich, ob var an Speicheradresse $deadbeef liegt 😕

    nochmal ja. Ob der Code Sinn macht (Vergleich, dass var @ 0xdeadbeef liegt), ist eine andere Frage (und hat nichts mit dem Thema zu tun).



  • supertux schrieb:

    nop, da widerspreche ich dir.
    siehe

    int var; 
    if(&var == 0xdeadbeef);
    

    gcc sagt:

    b.c:4: warning: comparison between pointer and integer
    

    also ist eine nackte Adresse (&var) kein unsigned int, während 0xdeadbeef keine Adresse ist sondern ein normales int ist.

    da widerspricht sich doch nix. '&var' ist keine 'nackte' adresse, sondern die eines 'ints'. die vermeintlich 'nackte' adresse, mit der du den vergleich versuchst, ist aus sicht des compilers keine adresse, sonder ein integer-wert und dazu noch vorzeichenbehaftet (es wäre ein schlechter compiler, wenn er hierbei nicht warnen würde, wobei wohl die bessere warnung "comparison between address of integer and integer" wäre, denn von einem pointer ist weit und breit nichts zu sehen).
    anders bei dem post von pointercrash(). der void*-cast sagt dem compiler, dass rechts eine adresse steht und - schwupps - frisst er den code. er beschwert sich nicht, dass '&var' auf einen 'int' zeigt, weil bei dem vergleich offensichtlich nur die adresse interessiert und nicht der typ. also, wo ist der widerspruch?
    🙂



  • ich weiß nicht, was du da erzählst. Was ist denn für dich eine 'nakte' Adresse? Erklär mal das lieber.

    anders bei dem post von pointercrash(). der void*-cast sagt dem compiler, dass rechts eine adresse steht und - schwupps - frisst er den code. er beschwert sich nicht, dass '&var' auf einen 'int' zeigt, weil bei dem vergleich offensichtlich nur die adresse interessiert und nicht der typ. also, wo ist der widerspruch?

    Siehe

    void foo()
    {
      int  *ptr_i;
      double *ptr_d;
      void *ptr_void;
    
      ptr_i == ptr_d; /* line 7 */
      ptr_i == ptr_void;
      ptr_d == ptr_void;
    }
    

    da bekomme ich

    o.c:7: warning: comparison of distinct pointer types lacks a cast
    

    Der Compiler wirft nur eine Warnung, wenn ich (int*) und einen (double*) vergleiche. Der Compiler beschwert sich nicht, weil (void) 0xdeadbeef* ein (void*) ist.



  • supertux schrieb:

    ich weiß nicht, was du da erzählst. Was ist denn für dich eine 'nackte' Adresse? Erklär mal das lieber.

    na, einfach nur den zahlenwert. sozusagen die 'hausnummern' der speicherzellen. mir ist schon klar, dass, wenn man in C einfach nur einen wert hinschreibt, man einen 'int' bekommt. war ja auch nicht das problem, aber ich gebe zu dass ich's hätte deutlicher machen müssen. adressen kann man in C in void*-variablen speichern (oder in vielleicht einem ptrdiff_t, wenn man damit rechnen will, wobei der wiederum für relative adressoffsets besser gegeignet ist, weil er signed ist).

    supertux schrieb:

    Der Compiler wirft nur eine Warnung, wenn ich (int*) und einen (double*) vergleiche. Der Compiler beschwert sich nicht, weil (void) 0xdeadbeef* ein (void*) ist.

    klar, der compiler macht dich auf eventuelle fehler aufmerksam. das ist auch richtig so und bei 'nem void* interessiert der typ dessen, was mit der adresse referenziert werden kann, eben nicht. daher gibt's auch kein warning.
    🙂


Anmelden zum Antworten