Ausnahmen vom Array, das in einen Zeiger zerfällt?

Lesezeit: 3 Minuten

Benutzeravatar von nj-ath
nj-ath

Ich habe in vielen Beiträgen gesehen, dass “in den meisten Fällen Array-Namen in Zeiger zerfallen”.
Kann ich wissen, in welchen Fällen/Ausdrücken der Array-Name nicht in einen Zeiger auf seine ersten Elemente zerfällt?

  • Mehr Kontext ist erforderlich: Arbeiten Sie in einer bestimmten Sprache? Haben Sie ein Beispiel?

    – abiessu

    19. Juli 2013 um 18:23 Uhr

  • Betrachten Sie die C-Sprache. Und ich suche nach einem Beispiel, bei dem Array-Namen nicht in Zeiger zerfallen.

    – nj-ath

    19. Juli 2013 um 18:25 Uhr

  • @TheJoker Ich habe hier eine Antwort gegeben, in der ich diese Fälle zeige

    – Grijesh Chauhan

    19. Juli 2013 um 18:57 Uhr

  • Zum zweiten Punkt von H2Co3, dh mit sizeof, lese ich Head First C, und es veranschaulicht zunächst den Zeigerzerfall mithilfe von sizeof(msg) innerhalb einer Funktion, bei der msg als Argument übergeben wurde. Sie hatten eine kleine Box, in der erklärt wurde, dass eine Array-Variable zu einem Zeiger zerfällt, wenn sie als Argument (Paraphrasierung) an eine Funktion übergeben wird, sodass Sie 4 oder 8 (Bytes) erhalten, keine Array-Größe. Ich war verwirrt, weil sie im nächsten Kapitel über die String-Bibliothek strlen() einführen und es genauso verwenden wie sizeof(). Ich bin hergekommen, um meinen Kopf zu ordnen, und jetzt hast du ihn noch ein bisschen mehr verdreht. 😛

    – Punstress

    6. August 2013 um 0:36 Uhr

  • Diese Antwort enthält alle Ausnahmen mit Beispielen.

    – legends2k

    9. Juli 2014 um 8:27 Uhr

Sicher.

In C99 gibt es drei grundlegende Fälle, nämlich:

  1. wenn es das Argument der ist & (Adresse des) Betreibers.

  2. wenn es das Argument der ist sizeof Operator.

  3. Wenn es sich um ein Zeichenfolgenliteral des Typs handelt char [N + 1] oder ein Wide-String-Literal vom Typ wchar_t [N + 1] (N ist die Länge der Zeichenfolge), die zum Initialisieren eines Arrays verwendet wird, wie in char str[] = "foo"; oder wchar_t wstr[] = L"foo";.

Außerdem wurde in C11 das neu eingeführte alignof Operator lässt sein Array-Argument auch nicht in einen Zeiger zerfallen.

In C++ gibt es zusätzliche Regeln, zum Beispiel bei der Übergabe per Referenz.

  • Entschuldigung, aber könnten Sie den 3. Fall genauer erklären? Ich meine, ist das nicht Str im dritten Fall verwendet, um auf den Speicherort der Zeichenfolge zu verweisen? Also wieder ein Hinweis?

    – nj-ath

    19. Juli 2013 um 18:38 Uhr

  • @TheJoker Nein, das wäre const char *str_ptr = "literal";. In meinem Beispiel str wird als Array deklariert, daher ist es ist eine Anordnung.

    Benutzer529758

    19. Juli 2013 um 18:39 Uhr

  • 3. Fall ist kein Fall. Dies ist nur einer der Fälle für die Array-Initialisierungssyntax, wenn es sich um ein Array von handelt char. Die rechte Seite einer Array-Initialisierungsanweisung akzeptiert nicht einmal einen Ausdruck, daher ist sie als Antwort auf diese Frage nicht sinnvoll.

    – neues Konto

    21. Juli 2013 um 9:25 Uhr

  • @newacct Ich schlage vor, Sie lesen den entsprechenden Abschnitt des C-Standards – diese Fälle werden buchstäblich aufgezählt. Darüber hinaus gilt bei einer Array-Initialisierung genau dann, wenn das RHS ein String-Literal ist ist ein Ausdruck (vom Array-Typ), keine Initialisierungsliste.

    Benutzer529758

    21. Juli 2013 um 9:53 Uhr

  • @H2CO3: Zunächst einmal heißt es zur Initialisierung ausdrücklich “String-Literal”. Es sagt überhaupt nichts über “Array-Ausdruck” oder “Ausdruck” aus. Die String-Literal-Syntax wird also zufällig an zwei Stellen verwendet: als rechte Seite einer Initialisierung und auch als Ausdruck. Das bedeutet nicht, dass die rechte Seite der Initialisierung ein Ausdruck ist. Außerdem wurde speziell nach “Array-Namen” gefragt, und ein Zeichenfolgenliteral ist kein Array-Name, und Sie können keinen Array-Namen (oder einen anderen Array-Ausdruck außer einem Zeichenfolgenliteral) auf die rechte Seite einer Initialisierung für ein Array setzen.

    – neues Konto

    22. Juli 2013 um 3:12 Uhr


1419230cookie-checkAusnahmen vom Array, das in einen Zeiger zerfällt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy