Unterschied zwischen [square brackets] und *Sternchen

Lesezeit: 3 Minuten

Wenn Sie eine C++-Funktion wie schreiben

void readEmStar( int *arrayOfInt )
{
}

vs eine C++-Funktion wie:

void readEmSquare( int arrayOfInt[] )
{
}

Was ist der Unterschied zwischen verwenden [square brackets] vs * Sternchen, und hat jemand einen Styleguide, der vorzuziehen ist, vorausgesetzt, sie entsprechen dem Compiler?

Der Vollständigkeit halber ein Beispiel

void readEmStar( int *arrayOfInt, int len )
{
  for( int i = 0 ; i < len; i++ )
    printf( "%d ", arrayOfInt[i] ) ;
  puts("");
}


void readEmSquare( int arrayOfInt[], int len )
{
  for( int i = 0 ; i < len; i++ )
    printf( "%d ", arrayOfInt[i] ) ;
  puts("");
}

int main()
{
  int r[] = { 2, 5, 8, 0, 22, 5 } ;

  readEmStar( r, 6 ) ;
  readEmSquare( r, 6 ) ;
}

Unterschied zwischen square brackets und Sternchen
Brian R. Bondy

Wenn Sie den Typ verwenden char x[] anstatt char *x ohne Initialisierung, Sie können sie als gleich betrachten. Sie können einen neuen Typ nicht als deklarieren char x[] ohne Initialisierung, aber Sie können sie als Parameter für Funktionen akzeptieren. In diesem Fall sind sie dasselbe wie Zeiger.

Wenn Sie den Typ verwenden char x[] anstatt char *x mit Initialisierungsie sind völlig 100% unterschiedlich.


Beispiel dafür, wie char x[] unterscheidet sich von char *x:

char sz[] = "hello";
char *p = "hello";

sz ist eigentlich ein Array, kein Zeiger.

assert(sizeof(sz) == 6);
assert(sizeof(sz) != sizeof(char*)); 
assert(sizeof(p) == sizeof(char*));

Beispiel dafür, wie char x[] ist das gleiche wie char *x:

void test1(char *p)
{
  assert(sizeof(p) == sizeof(char*));
}

void test2(char p[])
{
  assert(sizeof(p) == sizeof(char*));
}

Codierungsstil für die Übergabe an Funktionen:

Es ist wirklich egal, welche du tust. Manche Leute bevorzugen char x[] weil es klar ist, dass Sie ein Array übergeben möchten und nicht die Adresse eines einzelnen Elements.

Meist ist dies aber schon klar, da man einen weiteren Parameter für die Länge des Arrays hätte.


Weiterlesen:

Bitte lesen Sie diesen Beitrag mit dem Titel Arrays sind nicht dasselbe wie Zeiger!

  • Da Arrays und Zeiger in C++ ziemlich ähnlich sind, könnten Sie vielleicht kurz etwas zum Unterschied hinzufügen (Stack vs. Heap usw.).

    – Schluckauf

    24. November 2009 um 15:18 Uhr

  • in readEmSquare gibt die Überprüfung von sizeof( arrayOfInt ) 4 zurück, es ist ein Zeiger

    – bobobobo

    24. November 2009 um 15:20 Uhr

  • Siehe meinen Hinweis zur Verwendung von char[] ohne Initialisierung.

    – Brian R. Bondy

    24. November 2009 um 15:21 Uhr

  • 🙂 – also was den Stil betrifft, spielt es eine Rolle/was als Argument für eine Funktion?

    – bobobobo

    24. November 2009 um 15:24 Uhr

  • @tloach: Es gibt keinen Unterschied zwischen “Stapel und Haufen”. Ein Zeiger muss nicht auf den Heap zeigen.

    – jalf

    24. November 2009 um 16:12 Uhr

C++-Standard 13.1.3

— Parameterdeklarationen, die sich nur in einem Zeiger * von einem Array unterscheiden []
sind gleichwertig. Das heißt, die Array-Deklaration wird angepasst, um eine Zeigerdeklaration zu werden (8.3.5). Bei Parametertypen (8.3.4) sind nur die zweite und die folgenden Array-Dimensionen von Bedeutung.[Beispiel:[Example:

 int f(char*);
 int f(char[]);  // same as f(char*);
 int f(char[7]);  // same as f(char*);
 int f(char[9]);  // same as f(char*);
 int g(char(*)[10]);
 int g(char[5][10]);  // same as g(char(*)[10]);
 int g(char[7][10]);  // same as g(char(*)[10]);
 int g(char(*)[20]);  // different from g(char(*)[10]);

—Beispiel beenden]

  • Gutes Beispiel! Ich habe mich darüber gewundert … also wird die Nummer vom Compiler verworfen, wenn Sie sie im Grunde angeben, es sei denn, sie ist 2D oder mehr. In diesem Fall wird nur die letzte Nummer beibehalten.

    – bobobobo

    24. November 2009 um 18:31 Uhr

Es gibt keinen Unterschied zwischen Ihren beiden Codes, abgesehen von dem offensichtlich unterschiedlichen Stil. In beiden Fällen wird das Array per Referenz und nicht per Wert als Funktionsparameter übergeben type *x und type x[] sind semantisch gleich.

  • Ein Array wird hier nicht per Referenz übergeben (ja, in C++ ist es auch möglich, Arrays per Referenz zu übergeben). Stattdessen zerfällt das Array, wenn es an eine Funktion übergeben wird, zu einem Zeiger auf das erste Element, das als Wert übergeben wird. Allerdings kein Unterschied zwischen den Codes.

    – Onkel Bens

    24. November 2009 um 15:50 Uhr

Bei der Stilfrage werde ich meinen Hals herausstrecken und sagen, dass int *arrayOfInt besser ist. Unabhängig davon, welche Syntax Sie verwenden, übergeben Sie einen Zeiger, und der Typ sollte dies deutlich machen.

Dies ist nur meine Meinung.

Die beiden Ausdrücke sind äquivalent. Sie werden jeweils zur Adresse des ersten Elements des Arrays arrayOfInt ausgewertet.

886910cookie-checkUnterschied zwischen [square brackets] und *Sternchen

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

Privacy policy