Zeiger



  • dosomething schrieb:

    Wieso ist auf einmal eine norm. Adresse ein Zeiger??

    int function(int a);
    ....
    int main(void)
    {
    
     function(10);
    ....
    }
    

    wieso ist ein normaler wert eine variable, bzw. eine variable ein normaler wert ?



  • dosomething schrieb:

    Wieso ist auf einmal eine norm. Adresse ein Zeiger??

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



  • LordJaxom schrieb:

    dosomething schrieb:

    Wieso ist auf einmal eine norm. Adresse ein Zeiger??

    Eine Adresse ist immer ein Zeiger.

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



  • 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?
    🙂


Anmelden zum Antworten