String, Pointer, Array, sizeof - Verständnisfragen



  • Hallo. Es gibt für mich immer ncoh einige eigentlich triviale Dinge, die für mich nicht ganz klar sind. Und zwar folgendes:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char a_ab[] = "ab";
        printf("a_ab = %s\n",a_ab);
        for(int i = 0; i < sizeof(a_ab);i++)
            printf("%d = %c ", a_ab[i], a_ab[i]);
        puts("\n");
    
        char *z_abcde = "abcde"; 
        printf("z_abcde = %s\n",z_abcde);
        for(int i = 0; i < sizeof(z_abcde);i++)
            printf("%d = %c ", z_abcde[i], z_abcde[i]);
        puts("// \"wrong\" size.\n");
    
        printf("z_abc = %s\n",z_abcde);
        for(int i = 0; i < strlen(z_abcde)+1;i++)
            printf("%d = %c ", z_abcde[i], z_abcde[i]);
        puts("// that way."); 
    
        return 0;
    }
    

    Wir wissen, dass der Bezeichner eines Arrays ein Zeiger ist, der auf das erste Element des Arrays zeigt. Ein char * ist ebenfalls ein Pointer, der ebenfalls auf eine Zeichenkette bzw. auf ein Zeichen (je nach Fall) zeigt. Wieso behnadelt sizeof diese beiden scheinbar gleichen Pointer anderes (siehe Code). Vom Arraypointer rechnet der Compiler die richtige Größe aus, aber vom "normalen" Pointer nicht. Es also meine Annahme richtig, dass es kein richtiger Pointer, sondern ein spezieller Arraypointer ist, vom der der Compiler halt die Größe kennt?

    Und ncoh eine kleine Zusatzfrage? Es es angebracht immer strlen, anstatt sizeof zu benutzern... ich habs glaube ich mal irgendwo gelesen, aber kann mich nicht mehr erinnern 😕



  • sharp schrieb:

    Wir wissen, dass der Bezeichner eines Arrays ein Zeiger ist, der auf das erste Element des Arrays zeigt.

    nee, eben nicht. er ist das array selber. ein pointer ist nicht dabei.

    int array[...];  // <-- array, kein pointer
    int *pointer;    // <-- pointer, kein array
    

    sharp schrieb:

    Und ncoh eine kleine Zusatzfrage? Es es angebracht immer strlen, anstatt sizeof zu benutzern... ich habs glaube ich mal irgendwo gelesen, aber kann mich nicht mehr erinnern

    'strlen' nur für strings, bzw. speicher mit 'ner 0 am ende. sizeof() ist für typen und instanzen davon.
    🙂



  • Aber der Bezeichner (ohne eckige Klammern) eines Array verhält sich in vielen Fällen wie ein Pointer. Und einige meinen es ist ein Pointer..:

    http://wwwuser.gwdg.de/~kboehm/ebook/12_kap08_w6.html#256769

    "Ein Array-Name ohne eckige Klammern ist ein Zeiger auf das erste Element des Arrays."

    ok array[...] ist kein Pointer. Aber array schon. Und trotzdem wertet sizeof beide Pointer unterschiedlich aus. Meinst du, dass array[...] ein Array ist oder meinst du, dass selbst ein array ein Array ist?



  • ^^der name tut doch nix zur sache. wenn du eine beliebige variable anlegst, kommste ja auch nicht auf die idee, dass ihr 'name ein zeiger' sein könnte, oder? *fg* die verwirrung kommt wohl daher, dass man arrays auch mit pointer-schreibweise und pointer mit array-schreibweise ansprechen kann, aber ein array ist kein pointer, erst recht nicht sein bezeichner.
    🙂



  • In diesem Sinne bist du auch nicht ;fricky. ;fricky ist nur der Bezeichner bzw. ein Symbol, das mit deiner digitalen C++-Identität assoziert ist^^. Ein Haus ist ja auch kein Haus, sondern nur ein Wort.



  • sharp schrieb:

    In diesem Sinne bist du auch nicht ;fricky. ;fricky ist nur der Bezeichner bzw. ein Symbol...

    so isses. ;fricky ist der bezeicher für ein individuum, das im ansi-c forum rumtrollt, der typ selber versteckt sich in den tiefen des internets. so ganz passt der vergleich aber nicht, weil sich hier jeder ;fricky nennen könnte, während ein variablen-name in C eindeutig ist. jedenfalls ist ein bezeichner kein zeiger, zumindest nicht im sinne von zeigern in C, die ja selber variablen sind, die adressen speichern können.

    sharp schrieb:

    C**++**-Identität

    grrr... keine beleidigungen bitte. *fg*
    🙂



  • c# schrieb:

    Ein Haus ist ja auch kein Haus, sondern nur ein Wort.

    das führt doch zu nichts...

    evtl. als kleine anmerkung, sizeof(type) wird zur compile zeit in eine zahl gewandelt, strlen(xxx) zur laufzeit, also kannst du mit sizeof(type) nichts "messen" dessen größe zur compile zeit noch nicht feststeht, bzw sich ändern kann,
    ein int array[1024]; kannst du als festen typ betrachten dessen größe sich nie ändern wird und daher klappt ein sizeof(array); dies sagt dir aber nicht wieviel von diesem speicher jetzt verwendet wird dafür nimmst dann strlen(array)

    hoffe das hilft dir ein bischen 😉

    lg lolo



  • strlen(array) macht natürlich eher sinn wenns so da steht "char array[1024];" 🤡



  • das hilft. Genau nach dieser Erklärung hab ich gesucht..



  • noobLolo schrieb:

    strlen(array) macht natürlich eher sinn wenns so da steht "char array[1024];"

    doch nur, wenn dieses array für nullterminierte strings verwendet wird, die bei array[0] anfangen. heisst ja nicht ohne grund strlen() und nicht arrlen().
    🙂



  • ;fricky schrieb:

    noobLolo schrieb:

    strlen(array) macht natürlich eher sinn wenns so da steht "char array[1024];"

    doch nur, wenn dieses array für nullterminierte strings verwendet wird, die bei array[0] anfangen. heisst ja nicht ohne grund strlen() und nicht arrlen().
    🙂

    ja da hast du natürlich recht 🤡


Anmelden zum Antworten