15 - 2.4.1 C-Kurzeinführung: Felder, Zeiger und Felder, Zeigerarithmetik, Mehrdimensionale Felder [ID:14734]
50 von 248 angezeigt

Ja, ich hatte zu Beginn meiner Vorlesung ja schon angekündigt, dass das Thema Felder an einer

etwas ungewöhnlichen Stelle kommt. Normalerweise sind Felder ja einfach Verbunddatentypen sowie

Strukturen auch und man würde sie natürlich im Zusammenhang mit den Datentypen und Variablen

einführen. Aber Felder haben auch einen sehr engen Bezug zu den Zeigern und deswegen dachte

ich eigentlich, dass es vernünftig ist, erstmal die Zeiger einzuführen und dann die Felder zu

bringen und dann vor allem den Zusammenhang zwischen Zeigern und Feldern darzustellen. Und

das möchte ich jetzt machen. Als erstes will ich die Felder erstmal normal kurz einführen. Zunächst

am Beispiel der eindimensionalen Felder. Es gibt in sie natürlich auch mehrdimensionale Felder,

sie haben aber eine relativ geringe Bedeutung. Also eine Reihe von Daten des selben Typs kann

zu einem Feld zusammengefasst werden. Bei der Definition eines Feldes wird die Größe des

Feldes mit angegeben. Diese Größe muss eine Konstante sein und ab dem C Standard 99 kann

bei lokalen Feldern und zwar bei lokalen Feldern des Datentyps oder des Speichertyps Automatic auch

ein zur Laufzeit berechneter Wert als Felddimension eingesetzt werden. Das geht natürlich nur bei der

Speicherklasse Automatic, denn Daten der Speicherklasse Static werden ja bereits zu

Programm Start angelegt, also der Speicherplatz von Static Daten wird bereits beim Programm Start

angelegt. Und dann kann ich dafür natürlich keinen Wert hernehmen als Feldgröße, der erst zur

Laufzeit bekannt wird. Das muss damit ja ein bereits zur Besetzungszeit bekannter und damit

konstanter Wert sein. Der Zugriff auf die Feldelemente erfolgt ganz normal durch Indizierung,

beginnend bei Null. Das ist eigentlich in allen Programmiersprachen mit Feldern so. Die

Definition eines Feldes sieht dann so aus, wie das hier beschrieben ist. Ich gebe den Feld Typ an,

dann den Namen des Feldes und dann in eckigen Klammern die Größe und da können also mehrere

Größen Werte stehen, dann wäre es ein mehrdimensionales Feld und danach kann auch noch eine Initialisierung

kommen. Beispiele dafür wären sowas wie x integer x von 5 oder double f von 20, also letztendlich

fünf Integers hintereinander stehend oder 20 Doubles hintereinander stehend. Die Initialisierung

des Feldes erfolgt dann ganz normal wie bei variable Initialisierungen auch. Es kommt ein Ist-Gleichzeichen

und dann kommt der Initialisierungswert. Im Fall von einem Feld sind es natürlich mehrere Werte,

die dann durch geschweifte Klammern, gekapselt hintereinander angegeben werden. Also ein Beispiel

hier wäre dieses Feld integer prim von 4 mit vier Initialisierungswerten 2, 3, 5 und 7, also

vier Primzahlen oder Charaktername von 5, fünf Charakters, die dann eben durch Charakterliterale,

wie nämlich der Buchstabe großes O, der Buchstabe T, noch ein T, ein kleines O,

Initialisiert werden. Und hier ist eine sehr wichtige Sache, dieses Charakterfeld wird durch

einen sogenannten Nullcharakter abgeschlossen. Das ist eine Konvention in C, das Zeichenketten

generell durch ein spezielles Zeichen, das in der internen Kodierung den numerischen Wert Null hat,

das ist dieser Nullcharakter Backslash Null, dass Zeichenketten so abgeschlossen werden. Und dieser

Nullcharakter unterscheidet sich vom Zeichen Null, also von der Zahl Null, die würde man dann in

Apostroph Null Apostroph darstellen, also ohne den Backslash. Und die Zahl Null in der internen

Kodierung hat einen ganz anderen Wert, wie eben dieser Nullcharakter, der eben den Wert, auch

numerisch den Wert Null hat. Wenn man die explizite Feltdimension weglässt, dann schaut sich der

Compiler einfach an, wie viele Initialisierungskonstanten sind angegeben und macht das

Feld entsprechend groß. Also hier an dieser Stelle integer, Priem, Klammer auf Klammer zu, würde das

Feld auch vier Elemente groß werden oder eben hier Name würde das Feld auch fünf Elemente groß

werden. Wenn man zu wenige Initialisierungskonstanten angibt, dann wird das Feld einfach mit weiteren

Null Elementen aufgefüllt. Charakterfelder können auch durch sogenannte String-Literale

initialisiert werden. Ein String-Literal ist letztlich eine Zeichenkette, die durch Doppelapostroph

geklammert ist, also sowas wie hier Doppelapostroph, Otto Doppelapostroph. Und wenn sie jetzt vorne

anschauen, das Feld hat die Größe 5, die Dimension 5, obwohl hier nur vier Zeichen stehen. Man muss

einfach sehen, bei so einem String-Literal wird dieses terminierende Nullzeichen immer noch

automatisch mit rangehängt. Das heißt also Doppelapostroph, Otto Doppelapostroph ist fünf

Bytes lang, auch wenn man jetzt da nur vier Buchstaben sieht. Und das Name von zwei ist

natürlich exakt das gleiche, bloß eben ohne Felddimension bei der Definition.

Teil einer Videoserie :

Zugänglich über

Offener Zugang

Dauer

00:27:01 Min

Aufnahmedatum

2020-05-03

Hochgeladen am

2020-05-03 13:26:21

Sprache

de-DE

Einbetten
Wordpress FAU Plugin
iFrame
Teilen