• Keine Ergebnisse gefunden

Arrays in C

N/A
N/A
Protected

Academic year: 2021

Aktie "Arrays in C"

Copied!
5
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Arrays in C

Jörn Loviscach

Versionsstand: 17. November 2010, 21:48

Die nummerierten Felder sind absichtlich leer, zum Ausfüllen in der Vorlesung.

Videos dazu: http://www.youtube.com/joernloviscach

This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Germany License. To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/de/ or send a letter to Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.

1 Grundlagen

Nach bool und den diversen Zahlentypen kommt nun die erste komplexe Datentyp („Datenstruktur“): das Array, im Deutschen auch Feld genannt. Es speichert noder n×moder n×m×poder . . . Elemente eines festen Datentyps, vergleichbar mit einer Liste, einem Setzkasten oder einem Wohnsilo:

1

Jede Zelle eines Arrays lässt sich mit Hilfe ihres Index bzw. ihrer Indizes fin- den. In C und seinen Nachfolgesprachen zählt man allerdings ab null, nicht ab eins:

2

Die Dimension des Arrays sagt, wie viele Indizes man benötigt, um eine Zelle anzugeben.

1

(2)

1 GRUNDLAGEN 2

Wozu das?

3

So baut man ein Array aus 4 mal 5 Zellen für Integer-Zahlen:

4

So wird in eine Zelle geschrieben:

5

So wird aus einer Zelle gelesen:

6

So wird der Inhalt einer Zelle um eins erhöht:

7

Demo im Debugger. Genau hingucken mit den eckigen Klamern!

Achtung: C und C++ prüfen der Einfachheit und der Geschwindigkeit halbernicht, ob man nur erlaubte Indizes einsetzt:

(3)

2 INITIALISIERUNG UND ZUWEISUNG 3

8

Wenn man also beim Programmieren nicht aufpasst, kann es passieren, dass man außerhalb der Grenzen des Arrays im Speicher liest oder schreibt. Damit kann man sich ganz andere Teile seiner Daten oder seines Programms zerschießen. Das sorgt für schwer zu findende Fehler. Außerdem ist dies der wesentliche Grund für Sicherheitslücken. Zum Beispiel kann ein Angreifer so viele Daten eingeben, dass sie in den Speicher hinter dem Array geschrieben werden (Buffer Overflow).

In C++ und vor C99 auch in C muss die Größe eines Arrays mit einer Konstanten angegeben sein. Sie kann nicht erst im Programm berechnet werden, zum Beispiel aus dem Umfang der Eingangsdaten. Es gibt später Wege, um dieses Problem zu umgehen.

2 Initialisierung und Zuweisung

Nicht-statische Variablen (ob Arrays oder nicht) enthalten in C und C++ zu Beginn die Zahlen, die gerade zufällig an der Stelle im Speicher stehen. Das spart dem Rechner Zeit, ist aber nervig und gefährlich. Man kann die Werte zu Fuß setzen:

9

Es geht aber noch einfacher:

10

Wenn man alle Elemente angibt, kann der Compiler sich die Größe selbst ausrech- nen:11

Wenn man nicht alle alle Elemente angibt, setzt der Compiler die ungenannten auf null:

(4)

2 INITIALISIERUNG UND ZUWEISUNG 4

12

Auf diese Weise kann man ein Array einfach mit Nullen füllen:

13

In zwei Dimensionen usw. sieht das entsprechend aus:

14

Achtung: Diese Schreibweisen mit Schweifklammen klappen nur beim Initialisie- ren eines Arrays, danach nicht mehr!

Leider ist es nicht ganz so leicht, in C und C++ einem Array komplett ein anderes Array zuzuweisen. Dies meldet der Compiler als Fehler:

15

Man kann langweilig mit einerfor-Schleife kopieren:

16

Oder die in<string.h>deklarierte Funktionmemcpynutzen:

17

Der hintere Parameter sagt, wie viele Bytes im Speicher kopiert werden sollen.

Mit Hilfe des Operatorssizeofkann man sein Programm dabei plattformneutral und besser lesbar halten. (Dieser Operator ist etwas eigenwillig: Etwas Konkretes wie sizeof 2.34 geht ohne Klammern; Typnamen müssen dagegen wie sizeof (double)in Klammern stehen.)

(5)

3 ÜBERGABE UND RÜCKGABE VON ARRAYS 5

3 Übergabe und Rückgabe von Arrays

In eine Funktion hinein kommt ein Array in C und C++ recht einfach:

18

Die Größe der allerersten Dimension ist nicht nötig, um auf das Array zugreifen zu können. Man darf in dem formalen Parameter in der Funktionsdeklaration für die vorderste Dimension leere Klammern[]schreiben.

Bei dieser Übergabe an die Funktion wird das Array allerdings nicht wie eine normale Variable kopiert. Vielmehr ist alles, was die obige Funktion demxantut, in der aufrufenden Funktion beimasichtbar. Beides ist ein und dieselbe Sammlung an Daten, nur unter verschiedenen Namen angesprochen.

Ein Array aus einer Funktion zurückzugeben, ist dagegen in C und C++ so nicht vorgesehen. Das würde schon daran scheitern, dass Arrays nicht zu- gewiesen werden können und nicht automatisch kopiert werden. (Das zeige ich lieber gar nicht erst mit einem – zwangsläufig falschen – Codebeispiel.) Als Ausweg übergibt man der Funktion überlicherweise ein Array, das sie dann mit Werten füllt. Das klappt, weil das Array ja nicht in ein neues Array kopiert wird, sondern in der Funktion einfach nur unter anderem Namen lebt:

19

Referenzen

ÄHNLICHE DOKUMENTE

[r]

a[ 3] = 0;), würde sich diese Änderung auch auf das Array im Rufer auswirken... Beispiel:

Indem auf eine detail- lierte Darstellung wissenschaftlicher Theorien und empirischer Befunde weitgehend verzichtet wird, soll Lesen kann man lernen auch Leserinnen und

Darin liegt nun einerseits die große Chance, aber auch das große Problem, was Paul Watzlawick anspricht: auch schlechte oder nicht aktiv betriebene Kommunikation hinterläßt einen

Nachmittag: Java-Objekte erstellen und verwenden.. über einen Index).. über einen Index).. über einen Index).. über einen Index).. über einen Index)... Arrays: Definition,

Fülle das restliche Array, indem du immer den Wert des vorherigen Elements mit 1.01 multiplizierst.. Erinnerung: Arraydefinition

Teil 1: Schreiben Sie ein Programm, das das innere Produkt zweier Vektoren berechnet, wobei die Berechnung innerhalb einer Schleife erfolgen soll. Der korrekte Programmlauf muss

SEIKO EPSON’s Logic Array Design Systems brings engineering workstation level ASIC development to affordable personal computer systems or workstations. It gives you the necessary