c-string-Arrays (ist meine Erklärung richtig?) [Gelöst]



  • Hallo,
    In ein Buch, welches ich zum Lehrnen benutzte, steht folgender Code zum Thema
    C-Sting-Arryas:

    #include <iostream>
    
    using namespace std;
    
    int main() {
    
    	char * sa[] = { "eins\n", "zwei\n" };
    	char ** sp = sa;
    
    	cout << sa[0] << endl;
    	cout << *sa << endl;
    	cout << sa[1] << endl;
    	cout << sa[1][0] << endl;
    	cout << *sp << endl;
    	cout << sp[1] << endl;
    
    	cin.get(); 
    
    // ab hier ab ich selber alles geschrieben(wird nicht in der Erklärung
    // aufgegriffen)
    
    	cout << endl;
    
    	char sc[2] = "a";
    	char sd[2] = "b";
    	char* se[] = { sc,sd };
    	char ** sf = se;
    
    	cout << *(sf +1) << endl;
    
    	cin.get();
    
    }
    

    Ich glaube zwar das ich das Thema verstanden habe, sicher bin ich mir aber nicht. Deshalb werde ich nun versuchen es in meinen Worten zu erkläreun. Eure Aufgabe (wenn ihr mir helfen wollt) ist es meine Erklärung zu überprüfen, fehler zu finden und wenn nötig zu ergänzen. Ich glaube, dass dies der beste Weg ist sicher zu gehen, ob man etwas wirklich verstanden hat.

    Erklärung: Bei sa handelt es sich nicht um einen Array im eigentlichen sinn. Vielmehr ist sa ein Zeiger welcher auf zwei strings zeigt, welche den Inhalt "eins" oder den Inhalt "zwei" haben. Bei sp handelt es sich um einen Zeiger der auf den Anfang von "Array-zeiger" sa zeigt.

    Da sp auf einen "Array-zeiger" zeigt muss man ihn mit "" inizaliesieren.(Mit dieser Aussage bin ich mir sehr unsicher. Kann mir jemand bitte nochmal erklären was genau "" zu bedeuten hat.

    Für hilfe wäre ich sehr dankbar.

    Edit durch Arcoth: Nicht geschlossen, sondern gelöst ist der Thread.



  • Wie weit vorne kommt das denn in dem Buch? Wurde schon std::string behandelt?

    sa ist ein array. Da ist nichts besonderes dran. Allerdings müsste es const char sein. So doll ist das Buch wohl nicht.

    Initialisieren heißt, einen ersten Wert zuweisen. Das hat mit dem ** nichts zu tun. char** bedeutet Zeiger auf Zeiger auf char.


  • Mod

    Schon recht nahe dran, du meinst vermutlich das richtige. Aber um ganz sicher zu gehen, noch ein paar Klarstellungen:

    win8789 schrieb:

    Erklärung: Bei sa handelt es sich nicht um einen Array im eigentlichen sinn.

    Es ist schon ein Array, ein Array von zwei Zeigern! Aber es ist richtig, dass die Zeichenketten "eins\n" und "zwei\n" hier nirgendwo in "richtigen" Arrays liegen; sie sind fest im Programm eingebaut und die beiden Zeiger zeigen auf ihren jeweiligen Anfang.

    Vielmehr ist sa ein Zeiger welcher auf zwei strings zeigt, welche den Inhalt "eins" oder den Inhalt "zwei" haben.

    Wie gesagt, ist sa ein Array bestehend aus zwei Zeigern. Ein einzelner Zeiger könnte nicht auf zwei Werte gleichzeitig zeigen.

    Bei sp handelt es sich um einen Zeiger der auf den Anfang von "Array-zeiger" sa zeigt.

    Korrekt. sp zeigt auf den ersten Zeiger in sa (welcher wiederum auf das 'e' in "eins\n" zeigt).

    Ich weiß nicht, was du mit "Array-zeiger" meinst. Ein Zeiger auf ein Array? Das wäre etwas anderes. Ein Zeiger zeigt auf genau ein Ding und dieses Ding muss von dem passenden Typ sein, der durch den Zeiger gegeben ist. Dieses Ding kann auch das erste (oder irgendein) Element in einem Array sein und man kann dann das nächste Element erhalten, indem man einfach einen Schritt weiter geht. Der Zeiger weiß davon aber nichts. Ein Zeiger, der auf ein einzelnes Objekt zeigt und ein Zeiger der auf ein Objekt zeigt, das ein Element einer größeren Menge ist, sind beide komplett identisch.

    Da sp auf einen "Array-zeiger" zeigt muss man ihn mit "" inizaliesieren.(Mit dieser Aussage bin ich mir sehr unsicher. Kann mir jemand bitte nochmal erklären was genau "" zu bedeuten hat.

    Das Doppelsternchen ist ein Zeiger auf einen Zeiger. Das Array sa besteht aus zwei Zeigern auf char. Die können auf chars zeigen. Um auf einen Zeiger auf char zeigen zu können muss man logischerweise einen Schritt weiter gehen und braucht einen Zeiger auf einen Zeiger auf char. Genau das ist sp.

    Der Code ist übrigens veraltet. Man "eins\n" und "zwei\n" bestehen aus const char . Man kann zwar mit einem Zeiger auf char auch auf einen const char zeigen, aber das ist eine historische Sonderregel nur für den Datentyp char. Man sollte tunlichst nicht versuchen, diese const chars über den nicht-const Zeiger zu verändern! Die Sonderregel existiert aus Kompatibilitätsgründen für Uraltcode aus Zeiten, als man das mit dem const noch nicht so genau genommen hat. Es kann sein, dass diese Regel in Zukunft abgeschafft wird.

    Korrekt sähe der Code so aus:

    const char * sa[] = { "eins\n", "zwei\n" };
        const char ** sp = sa;
    

    Ein Lehrbuch, dass dies falsch vormacht, sollte vermutlich mit Vorsicht genossen werden (oder besser überhaupt nicht gelesen werden!). Um welches Buch handelt es sich?



  • SeppJ schrieb:

    Ich weiß nicht, was du mit "Array-zeiger" meinst.

    Hallo;
    erstmal Danke für deinen sehr gute und ausführliche Antwort 👍
    Mit "Array-zeiger" ist gemeint, dass ich denke das sa ein Array ist dessen Inhalt sa[0] und sa[1] jewiels auf zwei c-strings zeigt. (ich hoffe mal das" eins", "zwei" ein c-string ist). Sozusagen ein Array dessen Inhalt Zeiger sind. Ich hoffe, dass ich hiermit richtig liege. Bei meinen unteren selbstgeschrieben Beispiel habe ich ja auch erst zwei char-arrays (ich wieß, dass diese nicht zu hundert prozent das Selbe sind wie c-stings) erstellt, welche ich dann an se übergeben habe(se übernimmt die Rolle von sa).



  • SeppJ schrieb:

    Ein Lehrbuch, dass dies falsch vormacht, sollte vermutlich mit Vorsicht genossen werden (oder besser überhaupt nicht gelesen werden!). Um welches Buch handelt es sich?

    Beim Buch handelt es sich um "C++ Einführung und professionelle Programmierung " von Ulrich Breymann 6.,aktualisierte Auflage. 2001

    Zur verteigigung des Buches muss ich sagen das auf Seite 199 im Kampitel 6.2 c-Arrays folgendes, unten auf der Seite, steht:"Es ist guter Programmierstil, die Größe eines C-Arrays als Konstante zu deklarieren..."
    Aktualliesung. Nicht mehr beachetn bitte, da dieses Zitat nicht zum Beispiel passt.



  • win8789 schrieb:

    Beim Buch handelt es sich um "C++ Einführung und professionelle Programmierung " von Ulrich Breymann 6.,aktualisierte Auflage. 2001

    Argh!
    Jedes mal verspüre ich den Drang diese Bücher verteidigen zu müssen! Wahrscheinlich weil ich mal bei Bremen gewohnt habe, und der Autor sporadisch mitliest...
    Das finde ich gut.

    Hoffen wir, dass der Mann das in den letzten 14 Jahren glattgezogen hat! 🙂
    Vielleicht gibt es sogar Errata zu dem Buch - quasi ein Patch für Druckwerke...


  • Mod

    win8789 schrieb:

    Mit "Array-zeiger" ist gemeint, dass ich denke das sa ein Array ist dessen Inhalt sa[0] und sa[1] jewiels auf zwei c-strings zeigt. (ich hoffe mal das" eins", "zwei" ein c-string ist). Sozusagen ein Array dessen Inhalt Zeiger sind. Ich hoffe, dass ich hiermit richtig liege.

    Das ist korrekt, bloß ungewöhnlich. "Zeigerarray" für ein Array aus Zeigern hätte jeder sofort verstanden. Du sagst ja auch nicht "Kuchenerdbeere" für einen Kuchen aus Erdbeeren.

    Beim Buch handelt es sich um "C++ Einführung und professionelle Programmierung " von Ulrich Breymann 6.,aktualisierte Auflage. 2001

    Hat eigentlich einen ganz guten Ruf. ist vielleicht ein bisschen alt. 2001 ist ja schon eine Weile her, gerade in der Welt der Computertechnologie.

    Zur verteigigung des Buches muss ich sagen das auf Seite 199 im Kampitel 6.2 c-Arrays folgendes, unten auf der Seite, steht:"Es ist guter Programmierstil, die Größe eines C-Arrays als Konstante zu deklarieren..."

    Damit ist ganz was anderes gemeint.



  • SeppJ schrieb:

    Das ist korrekt, bloß ungewöhnlich. "Zeigerarray" für ein Array aus Zeigern hätte jeder sofort verstanden. Du sagst ja auch nicht "Kuchenerdbeere" für einen Kuchen aus Erdbeeren.

    Ich muss zugeben das ich beim Lesen lachen musste. Ja ich sollte mir in zukunft vielleicht etwas mehr gedanken machen wie ich die Dinge benenne. Da hast du recht.

    Nachmal vielen, vielen Dank dafür, dass du dir die Zeit genommen hast mir so eine umfangreiche Antwort zu senden. 🙂


Log in to reply