Unklarheit mit char*



  • Dann hab ich dass wohl verwechswelt, aber bei NICHT char Zeigern ist es doch so?

    int main()
    {
        int value = 1027;
        int *pointer = &value;
    
        cout << pointer << endl; //OUT: Adresse von "value"
        cout << &pointer << endl; //OUT: Adresse von "pointer"
        cout << *pointer << endl; //OUT: Wert der Variable (value) auf die der Zeiger (pointer) zeigt
    
        return 0;
    }
    

    Korrekt?

    Wie kann ich dann die Adresse eine char Zeiger Array Variable ausgeben?

    Kann man sagen (zum bessern Verständnis), dass es 2 Typen von char Zeigern gibt.

    1. char Array Zeiger, welche man nicht inkrementieren... kann.
    2. einfach nur char Zeiger, welche man inkrementieren kann, und die Adressen von char Array Zeigern aufnehmen kann.
    ???
    Oder gibts dafür spezielle Fachwörter?

    MfG
    Stromberg



  • Stromberg schrieb:

    Wie kann ich dann die Adresse eine char Zeiger Array Variable ausgeben?

    mit einem & (adressoperator) davor.

    Stromberg schrieb:

    1. char Array Zeiger, welche man nicht inkrementieren... kann.
    2. einfach nur char Zeiger, welche man inkrementieren kann, und die Adressen von char Array Zeigern aufnehmen kann.

    du kannst jeden pointer rauf und runterzählen, was abziehen, usw. nur nicht bei void-pointern.
    🙂



  • Stromberg schrieb:

    Kann man sagen (zum bessern Verständnis), dass es 2 Typen von char Zeigern gibt.

    nein. Ein beliebter Fehler ist es Arrays und Zeiger als gleich zu betrachten, weil ihre Handhabung dieselbe ist. Aber Arrays und Zeiger sind nich dasselbe. Arrays lassen sich implizit als Zeiger verwenden [1], also ohne Konverierung, sind aber keine Zeiger. Zeigerarithmetik oder Zuweisung geht nicht [2]. Umgekehrt ist es so, dass man bei Zeigern auf die Daten implizit über den []-array-Operator lesen/schreiben kann [3] aber dennoch keine Arrays sind [4].

    Klar?

    [1]
    deswegen ist es möglich

    char name[] = "supertux";
    printf("%s\n", name);
    

    [2]

    char name[] = "supertux";
    name++;  /* geht schief */
    name = "fricky"; /* ebenso */
    

    [3]

    char *name = "supertux";
    int len = strlen(name);
    for(i=0;i<len;++i)
      printf("name[%d]=%c\n", i, name[i]);
    

    [4]

    sizeof((void*)) == sizeof((char*)) == sizeof((int*)) =0 sizeof((struct wasauchimmer*)) == ....
    aber 
    char text[] = "abcdefghijklmnopqrstuvwxyz";
    sizeof((char*)) != sizeof(text)
    

    Wie kann ich dann die Adresse eine char Zeiger Array Variable ausgeben?

    was ist für dich eine "char Zeiger Array Variable"? 😕





  • Ist dass hier nun die Adresse auf die der Zeiger zeigt, oder die Adresse der Zeigervariable?

    int main()
    {
        char temp[11] = "Hallo Welt"; //char Array
        char *p = temp; //char Zeiger
        cout << &p << endl;
    
        return 0;
    }
    

    Die Adresse der Zeigervariable oder?

    MfG
    Stromberg



  • Exakt.



  • Und wie kann ich die Adresse rausbekommen, auf welche der char Zeiger zeigt? Weil sobald ich die Adresse mit "cout << p << endl;" ausgeben möchte wird ja gleich, automatisch dass ganze Wort hingeschrieben.

    MfG
    Stromberg



  • das liegt an C++s << Operator, der beim char* den String ausgeben will.

    std::cout << (void*) p << std::endl;
    

    sollte die Adresse ausgeben. Aber wir sind im ANSI C Forum, also

    printf("p zeigt auf %p\n", p);
    


  • Stromberg schrieb:

    Und wie kann ich die Adresse rausbekommen, auf welche der char Zeiger zeigt? Weil sobald ich die Adresse mit "cout << p << endl;" ausgeben möchte wird ja gleich, automatisch dass ganze Wort hingeschrieben.

    nimm niemals 'cout'. cout versucht immer schlauer zu sein, als der programmierer. benutze besser 'printf'.

    printf ("%p\n", p);
    

    🙂



  • @supertux
    Joa sry, ich treib mich normalerweise auch nur im C++ Forum herum, aber dass hat mich halt interessiert, und ich wollte nicht extra einen neuen Thread aufmachen. Aber jetzt weiss ich alles was ich wissen wollte. Dankeschön.

    MfG
    Stromberg


Anmelden zum Antworten