Arrays und Zeiger in C ++

Der Name des Arrays ist ein Zeiger auf das Array selbst. Das Feld ist eine Sequenz von Variablen im Speicher gespeichert. Das Array-Name verweist auf den ersten Punkt.

Das ist eine interessante Frage über Zeiger: Können Sie einen Funktionskopf, wie die folgende Zeile haben, und nur verwenden Größe von wie viele Elemente in dem Array zu bestimmen? Wenn ja, würde diese Funktion nicht der Anrufer die Größe des Arrays angeben müssen.

int AddUp (int Numbers []) {

Betrachten Sie diese Funktion in der gefunden Array01 Beispiel und ein Main() dass es nennt:

nichtig ProcessArray (int Numbers []) {cout lt; lt; "Inside Funktion: Größe in Bytes" lt; lt; sizeof (Zahlen) lt; lt; endl-} int main (int argc, char * argv []) {int MyNumbers [] = {1,2,3,4,5,6,7,8,9,10} -cout lt; lt; "Außenfunktion: Größe in Bytes" -cout lt; lt; sizeof (MyNumbers) lt; lt; Endl-ProcessArray (MyNumbers) -return 0-}

Wenn Sie diese Anwendung ausführen, ist hier, was Sie sehen:

Außerhalb Funktion: Größe in Bytes ist 40Inside Funktion: Größe in Bytes 4

Außerhalb der Funktion, weiß der Code, daß die Größe des Arrays 40 Bytes. Aber warum denken Sie den Code ein, dass die Größe 4, nachdem es innerhalb des Arrays ist? Der Grund dafür ist, dass, obwohl es scheint, dass Sie ein Array vorbei sind, sind Sie wirklich ein vorübergehendes Zeiger auf ein Array. Die Größe des Zeigers ist nur 4, und so das ist, was die endgültige cout Zeile druckt.

Deklarieren von Arrays hat einen leichten Idiosynkrasie. Wenn Sie ein Array deklarieren, indem eine bestimmte Anzahl von Elementen geben, wie zum Beispiel

int MyNumbers [5] -

Der Compiler weiß, dass Sie ein Array haben, und die Größe von Operator gibt Ihnen die Größe der gesamten Anordnung. Der Array-Name, dann ist beide ein Zeiger und ein Array! Aber wenn Sie deklarieren eine Funktion Header ohne Array-Größe, wie

nichtig ProcessArray (int Numbers []) {

Der Compiler behandelt dies als einfach ein Zeiger und nichts weiter. Diese letzte Zeile ist, in der Tat, das entspricht der folgenden Zeile:

nichtig ProcessArray (int * Zahlen) {

So in den Funktionen, die mit der Linie, die beiden folgenden Zeilen von Code deklariert sind gleichwertig:

Numbers [3] = 10 - * (Zahlen + 3) = 10-

Diese Gleichwertigkeit bedeutet, dass, wenn Sie eine verwenden extern Erklärung auf einem Array, wie

extern int MyNumbers [] -

und dann die Größe dieses Feldes wird der Compiler verwirrt. Hier ein Beispiel: Wenn Sie zwei Dateien, numbers.cpp und main.cpp, woher numbers.cpp erklärt ein Array und main.cpp wie in der erklärt, sie nach außen (gezeigt Array02 Beispiel), werden Sie einen Compiler-Fehler erhalten, wenn Sie anrufen Größe von:

#einschließen using namespace std-extern int MyNumbers [] - int main (int argc, char * argv []) {cout lt; lt; sizeof (MyNumbers) lt; lt; Endl-return 0-}

In Code :: Blocks, gibt der Compiler gcc uns diese Fehlermeldung:

Fehler: ungültige Anwendung von 'sizeof' unvollständigen Typ 'int []'

Die Lösung ist, die Größe des Arrays in Klammern zu setzen. So stellen Sie sicher, dass die Größe der gleiche wie in der anderen Quellcodedatei ist! Sie können gefälschte aus dem Compiler durch die Nummer zu ändern, und Sie nicht einen Fehler. Aber das ist schlecht Programmierstil und fragen nur nach Fehlern.

Obwohl ein Feld ist einfach eine Sequenz von Variablen in einem Speicher zueinander benachbart allem der Name nur ein Zeiger auf das erste Element in der Anordnung eines Arrays ist wirklich. Sie können den Namen als Zeiger verwenden. Allerdings tun, dass nur, wenn Sie wirklich brauchen, mit einem Zeiger zu arbeiten. Immerhin haben Sie wirklich keinen Grund, Code zu schreiben, kryptisch, wie * (Zahlen + 3) = 10-.

Das Umgekehrte ist ebenfalls wahr. Schauen Sie sich diese Funktion:

nichtig ProcessArray (int * Zahlen) {cout lt; lt; Numbers [1] lt; lt; endl-}

Diese Funktion nimmt einen Zeiger als Parameter, aber Sie Zugriff auf sie als Array zurück. Auch hier nicht schreiben Code wie this- stattdessen sollten Sie verstehen, warum Code funktioniert wie folgt. Auf diese Weise gewinnen Sie ein tieferes Verständnis von Arrays und wie sie im Inneren des Computers leben, und dieses Wissen, die wiederum helfen, können Sie Code schreiben, der richtig funktioniert.

Obwohl, ist der Array-Name nur ein Zeiger, der Name eines Arrays von ganzen Zahlen ist nicht genau das gleiche wie ein Zeiger auf eine ganze Zahl. Schauen Sie sich diese Zeilen Code (in der gefunden Array03 Beispiel):

int LotsONumbers [50] -int x-LotsONumbers = x-

Richten Sie die LotsONumbersZeiger auf etwas anderes: etwas als Integer deklariert. Der Compiler lässt Sie nicht erhalten Sie einen Fehler haben this-. Das wäre nicht der Fall, wenn LotsONumbers erklärt wurden als int * LotsONumbers- dann würde dieser Code arbeiten. Aber wie geschrieben, dieser Code gibt Ihnen einen Compiler-Fehler. Und glauben Sie es oder nicht, hier ist der Compiler Fehler, den Sie in Code :: Blocks erhalten:

Fehler: inkompatible Typen in Zuweisung von 'int *' auf 'int [50]

Dieser Fehler bedeutet, den Compiler eine bestimmte Unterscheidung zwischen den beiden Arten ist zu sehen, int * und int []. Dennoch ist der Array-Name in der Tat ein Zeiger, und Sie können es verwenden als Ein- man kann einfach nicht alles tun damit, dass man mit einem normalen Zeiger, wie es neu zuweisen.

Bei der Verwendung von Arrays, dann beachten Sie bitte die folgenden Tipps. Dies hilft Ihnen, halten Sie Ihre Arrays fehlerfrei:

  • Halten Sie Ihren Code konsistent. Wenn Sie erklären, zum Beispiel ein Zeiger auf eine ganze Zahl, behandeln es nicht als ein Array.

  • Halten Sie Ihren Code klar und verständlich. Wenn Sie Zeiger übergeben, dann ist es in Ordnung, die Adresse des ersten Elements zu nehmen, wie in (MyNumbers [0]) wenn dies macht den Code klarer - auch wenn es nur gleichwertig ist MyNumbers.

  • Wenn Sie ein Array deklarieren, versuchen immer eine Zahl in den Klammern zu setzen, es sei denn, Sie eine Funktion schreiben, die ein Array nimmt.

  • Wenn Sie die extern Stichwort ein Array zu deklarieren, gehen Sie voran und setzen auch die Größe des Arrays in Klammern. Aber im Einklang! Sie nicht eine Nummer eins Zeit und eine andere Nummer ein weiteres Mal verwenden. Der einfachste Weg, konsistent zu sein, ist eine Konstante zu verwenden, wie beispielsweise const int Arraysize = 10- in einer gemeinsamen Datei-Header und verwenden Sie dann, dass in Ihrem Array-Deklaration: int MyArray [Arraysize] -.

Menü