Frage zum Array

Bitte aktiviere JavaScript!
Gegeben sei ein array der Form

int [] array={0,1,-2,3,4,-5,6,7,-8};

Wieso ist int n=array.length-1; nicht 7 sondern 8? Und wieso überhaupt 8 und nicht -8?

Also Länge-1 wäre doch 9-1 -> Achte Inhalt und das wäre 7. Hier steht aber es sei 8.
 
Also es sollte auch -8 sein.

Bei Arraypositionen fängt man bei 0 zu zählen an.
Das heißt, wenn das Array die Länge 9 hat, dann ist das letzte Element beim Index 8.
 
oh ich glaub ich hab es jetzt wieso es +8 sind. Es wird ja eine Variable n deklariert die initialisiert wird mit
array.length-1 , wobei

array.length=9 (Ich habe einfach die inhalte zusammengezählt). 9-1=8
 
So weit kann ich gar nicht zählen... Die Länge des Array ist 9, das erste Element beginnt bei 0 und das letzte Element bei 8. Der Inhalt der ersten Stelle ist 0 und der der letzten -8.
Kapito?
 
Daß das erste Element den Index 0 hat liegt in der Funktionsweise von Computern (und historischer Faulheit!) begründet. Das merkst du, wenn du stattdessen mal in C oder gar Assembler programmierst.

Ein Array ist ein zusammenhängender Bereich im Speicher. Das heißt, um eine Position im Array anzugeben sind lediglich zwei Dinge nötig:
  1. Die Stelle, wo das Array anfängt. Dies wird durch eine einfache Speicheradresse angegeben. In C ist das eigentilch ein Pointer, wobei die C-Syntax diesen ein wenig vor dem Programmierer versteckt.
  2. Die Position im Array. Dies ist ein einfacher Offset, der auf die Speicheradresse draufaddiert wird. Die Länge aller Elemente im Array ist bekannt und gleich, und damit ist die genaue Speicheradresse eines Elements einfach berechenbar.
Ein kleines Beispiel: Wir nehmen an daß du ein Array mit fünf Integern hast, und ein Integer benötigt vier Bytes. Das Array wird wie folgt initialisiert:int a = new int[5];

Damit macht der Compiler folgendes: Es muß Speicher vom Betriebssystem beantragt werden, und zwar 5*4 = 20 Byte: fünf Elemente, wobei jedes Element vier Byte groß ist.

In C würde das so ablaufen, daß du dem Betriebssystem sagst, du willst gerne 20 Byte Speicher haben. Dann gibt dir das Betriebssystem einen Pointer, also eine Speicheradresse, an der dein Array anfangen kann.

Wenn du jetzt auf ein Element im Array zugreifst, dann mußt du die Speicheradresse des Elements berechnen. Und diese berechnet sich zu:
Adresse + (n * Elementgröße)

Jetzt überlege mal was du für n einsetzen mußt, damit du das erste Element bekommst. Bedenke, daß dein Speicherbereich bei 'Adresse' bereits anfängt.
Natürlich muß n=0 sein. Dein erstes Element liegt schließlich auf 'Adresse'.

Du mußt, wenn du in C oder Java programmierst, dich aber nicht mit Adressberechnung herumschlagen, das macht der Compiler für dich. Du sagst einfach: int i = a[0];

Edit:
Vergiss in deinem Beispiel bitte, was die Elemente genau enthalten. a.lenght() liefert die Anzahl der Elemente zurück. Du hast 8 Elemente drin, das sagt dir die Arraylänge (=Länge des Speicherbereichs). Das hat absolut nichts damit zu tun, was die Elemente für Werte haben. Probiere das mal aus:
int [] array={-8, 7, 6, -5, 4, 3, -2, 1, 0};
 
Du verwechselst anscheinend int n=array.length-1 mit int n=array[array.length-1]
das erste gibt dir die Länge des Arrays - 1 zurück, das andere das letzte Element
 
Hi und vielen dank, das hat mir sehr geholfen. Ich habe jedoch noch eine Frage zu folgendem ArrayProblem.

Wieso wird in dem Codebeispiel eigentlich kein Datentyp der Variable l zugeordnet z.b. int l. Stattdessen wird ohne einem Datentyp

l=a[0].length;

initialisiert;

Und wieso gilt l=3 wenn man den Code ausführt? Ich meine das erste Teilarray, bzw die erste Zeile hat keinen Inhalt, da {};.

Bedeutet das, dass dieses Teilarray übersprungen wird und es auch nicht die Länge 0 hat ? Macht eigentlich schon Sinn, denn die Länge bezieht sich ja auf die Anzahl der Inhalte und wenn kein Inhalt vorhanden ist kann auch nicht die Länge 1 vorhanden sein. Für die Länge 1 müsste mindestens ein Inhalt vorhanden sein und {}; ist kein Inhalt ...
 

Anhänge

Wieso wird in dem Codebeispiel eigentlich kein Datentyp der Variable l zugeordnet z.b. int l. Stattdessen wird ohne einem Datentyp

l=a[0].length;
Ich müßte das mal ausprobieren, aber eigentlich ist der Datentyp von l bekannt, l muß ein int sein. Es ist aber auf jeden Fall ganz scheußlicher Programmierstil (aber das ist nicht der Sinn der Aufgabe, denke ich).

Edit:
Ich habs grad mal ausprobiert: Der Code kann so nicht geschrieben werden, da meckert die IDE.
 
Zuletzt bearbeitet:
Ja, da muss sich wohl ein Fehler eingeschlichen haben. Hab es aber jetzt alles verstanden, also vielen dank!

Ich hänge momentan an folgendem Array-Code im Anhang. Mir liegt zwar die Musterlösung bei mich würde dennoch eure Meinung interessieren. Es geht um das Arrayfeld c[k++]. Wie kann man das genau interpretieren? c wäre ja der ite Inhalt des Arrays aber wenn c[k++] ist dann wüde sich der betrachtete Inhalt um eins verschieben nach jedem Schleifendurchlauf oder?
 

Anhänge

Zuletzt bearbeitet:
Ich versteh es leider nicht ganz.

int[] array = {0,1,2,3,..,n} ist ein Array mit n+1 Inhalten/Feldern, diese kann man aufrufen mit
array[k] z.b. das dritte Feld array [2]. Möchte man ein allgemeines Array mit einer Kapazitität von g deklarieren gilt

int[] array = new int[g]. Dieses array hat g+1 Inhalte.

Nun steht im oben genannten Code c[k++] und ich sehe hierzu nur bei array[k] eine äquivlenz, deshalb muss c[k++] das Feld/der Inhalt des Feldes bei k++ sein ? Ich habe mir deinen Post noch einmal durchgelesen, aber ich erkenne keine Verbesserung meiner Problemstellung.


Da k=0 gilt zu Beginn der Schleife folgt

k[0],k[1],k[2],..., d.h. man bewegt sich sozusagen innerhalb des Arrays Schritt für Schritt durch bis die Bedingung für die While Schleife nicht mehr gilt.

Lg
 
Nun steht im oben genannten Code c[k++] und ich sehe hierzu nur bei array[k] eine äquivlenz, deshalb muss c[k++] das Feld/der Inhalt des Feldes bei k++ sein ? Ich habe mir deinen Post noch einmal durchgelesen, aber ich erkenne keine Verbesserung meiner Problemstellung.
Zwischen den [] muß ein ganzzahliger numerischer Ausdruck >= 0 stehen, also 0, 1, 2, ... . Wie dieser Ausdruck aussieht, ist völlig egal. Das kann ein direkter Wert:
Java:
int i[] = new int[23];
eine Variable:
Java:
int n = 42;
int i[] = new int[n];
oder eine Funktion:
Java:
public int getN(){
    return 7;
}
int i[] = new int[getN()];
sein. Völlig egal was, solange am Ende ein Integer zwischen den [] steht. Auch k++ ist am Ende ein Integer.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben