it-swarm.com.de

Unterschied zwischen * (Zeiger + Index) und Zeiger []

int* myPointer = new int[100];

// ...

int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];

Gibt es einen funktionalen Unterschied zwischen *(myPointer + index) und myPointer[index]? Welches gilt als bessere Praxis?

20
Maxpm

Funktionell sind sie identisch.

Semantisch sagt der Zeiger dereference "Hier ist eine Sache, aber ich interessiere mich wirklich für die Sache, die X enthält", während der Array-Zugriff sagt: "Hier ist eine Reihe von Dingen, ich interessiere mich für die Xth-Einheit."

In den meisten Fällen würde ich die Array-Form bevorzugen.

36
Mike Caron

Es gibt keinen Unterschied zwischen

*(array+10); //and
array[10];

aber rate mal was? da +kommutativ ist

 *(10 + array); //is all the same
 10[array]; //! it's true try it !
21
hhafez

Nein, sie sind funktional gleichwertig.

Zuerst wird index auf die Typgröße hochskaliert, dann zur myPointer-Basis hinzugefügt, dann wird der Wert aus diesem Speicherplatz extrahiert.

Die "bessere Praxis" ist die besser lesbare, die normalerweise, aber nicht immer, die myPointer[index]-Variante ist.

Das liegt daran, dass Sie normalerweise an einem Element des Arrays interessiert sind, nicht an der Speicherstelle, an der dereferenziert werden soll.

12
paxdiablo

Es gibt keinen funktionalen Unterschied, den ich kenne, aber die Form myPointer[1] ist letztendlich besser lesbar und führt weit weniger zu Codierungsfehlern.

DC

Das Formular *(myPointer + 1) erlaubt es nicht, den Zeigertyp auf ein Objekt zu ändern und somit auf den überladenen Operator [] zuzugreifen. 

Auch das Debuggen ist viel schwieriger

 int *ints[10];
 int myint = ints[10]; 

ist visuell leichter zu erfassen als

 int *ints;
 int myint = *(ints + 10); 

der Compiler kann auch eine Bereichsüberprüfung einfügen, um den Fehler beim Kompilieren abzufangen.

DC

3
DeveloperChris

Lesbarer und wartbarer Code ist besserer Code.

Was den funktionellen Teil betrifft ... Es gibt keinen Unterschied. Beide Male spielst du "mit Gedächtnis".

1
Tadas Šubonis

Es gibt keinen funktionalen Unterschied. Die Entscheidung, eines der beiden Formulare zu verwenden, hängt in der Regel von dem Kontext ab, in dem Sie es verwenden. In diesem Beispiel ist die Array-Form nun einfacher zu verwenden und zu lesen und daher die naheliegende Wahl. Nehmen Sie jedoch an, dass Sie ein Zeichenfeld verarbeiten, beispielsweise die Wörter in einem Satz verbrauchen. Wenn Sie einen Zeiger auf das Array angeben, ist es möglicherweise einfacher, das zweite Formular wie im folgenden Codeausschnitt zu verwenden:

int parse_line(char* line) 
{
    char* p = line;
    while(*p)
    {
         // consume
         p++;
    }
    ...
}
1
341008

Wenn ein Array 'a' initialisiert wird, wird tatsächlich ein Zeiger auf seinen ersten Speicherplatz gesetzt, dh .. a [0] wird zurückgegeben, wobei es sich um nichts anderes handelt als a; 

Wenn Sie also 'a + 1' tun, ist dies tatsächlich ein Zeiger auf eine [1].

wenn Sie 'a + 2' tun, ist dies tatsächlich ein Zeiger auf eine [2].

wenn Sie 'a + 3' tun, ist dies tatsächlich ein Zeiger auf eine [3] .

wenn Sie also * (a + 1) verwenden, erhalten Sie den Wert von a [1] und einen ähnlichen Wert. Wenn Sie * (a) angeben, erhalten Sie tatsächlich ein [0], Ich denke, es ist jetzt ziemlich klar, wie es funktioniert ..

0
Tushar Gupta