C-Zeiger als Sprachparadox

    Vor kurzem bat mich ein Bekannter aus komplett anderen Programmierkreisen, ihm beim Labor in C ++ zu helfen. Im Code ging es um Folgendes:

    voiddo_something(MyObj *input[], int count){
        MyObj **copy = new MyObj*[count];
        for (int i = 0; i < count; ++i)
            *copy[i] = *input[i];
        ...
    }

    Dieser Fall erinnerte daran, dass das Thema "Zeiger" möglicherweise die Hauptfehlerquelle für Sprachschüler ist, und gleichzeitig - eine Art Pass, dessen Überwindung mit einem "Klicken" im Kopf zusammenhängt, was leider nicht alle Lehrer verursachen können. Ich hoffe, dass die im Folgenden vorgeschlagene sprachliche Analogie den derzeitigen Schülern helfen wird, dieses Konzept zu verstehen, und ihre Lehrer oder Freunde werden ihnen dieses Wissen vermitteln.

    Vor zehn Jahren wurde in einem Forum ein Kind wie ein Rätsel gemacht :
    Warum
    esse ich ein
    Mittagessen
    ? Kannibal-Esser Hat einen Kannibal-Esser zum Mittagessen eingeladen ?
    Ich möchte zeigen, dass dieses Rätsel am unmittelbarsten mit C / C ++ zusammenhängt, da das Thema Zeiger durch Analogie leicht zerlegt werden kann.

    Sehen Sie es Um zu verstehen, was "Essen von Kannibalen-Essen" ist, müssen wir das letzte Wort linguistisch analysieren. Am einfachsten lesen Sie dazu die Wurzeln von rechts nach links:

    • Ogre = jemand, der Leute isst.
    • Kannibalen = ein Mann, der Kannibalen isst = ein Mann, der diejenigen isst, die Menschen essen.
    • Kannibalen = = einer, der Kannibalen isst = einer, der diejenigen isst, die Kannibalen essen = einer, der diejenigen isst, die diejenigen essen, die Menschen essen

    Zum Glück wird in C / C ++ die gleiche Lesereihenfolge von rechts nach links für Referenzdatentypen verwendet:

    • MyClass * = Zeiger auf MyClass.
    • MyClass ** = Zeiger auf MyClass * = Zeiger auf Zeiger auf MyClass.
    • MyClass *** = Zeiger auf MyClass ** = Zeiger auf Zeiger auf MyClass * = Zeiger auf Zeiger auf Zeiger auf MyClass.

    Nachdem die rechte Seite herausgefunden wurde, nehmen wir jetzt die linke Seite.

    • Mittagessen Kannibalen = Mittagessen gegessen, der Kannibalen = Kannibalen isst.
    • Essen Kannibalen Essen = Kannibalen Essen = Essen Kannibalen Essen = Kannibalen.

    Deshalb lud der Kannibalist (= wer weiß, wer Kannibalen isst) zum Kannibalier. Offensichtlich besteht das Ziel einer solchen Einladung darin, die untergeordneten Kannibalen zu füttern.

    Das heißt, die linguistische Regel erweist sich als die folgende: Wenn Sie das Wort "food" oder "lunch" auf die linke Seite des Wortes setzen, das mit der Wurzel "ed" endet, setzen wir diese letzte Wurzel ab und lassen nur die Wortschatzbasis übrig.

    Zeiger in C / C ++ verhalten sich jedoch auch auf dieselbe Weise: Wenn links von einer Entität, die den Typ "Zeiger auf T" oder "T *" hat, das Zeigerzeichen (dieser Stern) gesetzt wird, wird als Ergebnis ein zusätzlicher Zeiger von abgeworfen von der Art, tatsächlich T (oder, um ganz genau zu sein, T & T erhalten haben, aber jetzt möchte ich das Thema Links und andere Werte nicht ansprechen). Ziemlich grob (wir ignorieren einige der Syntaxregeln), können wir das schreiben

    • * (T *) === T,
    • * (T **) === T *,
    • ** (T **) === T,
    • * (T ***) === T **,
    • usw.

    Was ist das ergebnis Ich habe keine klaren Regeln formuliert und zu Zeigern nichts Neues gesagt. Ich hoffe nur, dass diese sprachliche Analogie jedem, der C / C ++ studiert, helfen wird, dieses Thema schneller zu verstehen. Wenn Sie das Sternchen zum Essen nehmen und Lyuda für den Basistyp ... Sie haben verstanden.

    Jetzt auch beliebt: