Sie sind auf Seite 1von 25

Einfhrung in die Programmierung Vorlesung 5 W I S S E N 1

T E C H N I K

L E I D E N S C H A F T

Einfhrung in die Programmierung


DI Dr. Christian Safran, IICM DI Michael Steurer, IICM Univ.-Prof. DI Dr. techn. Frank Kappe, IICM

www.tugraz.at

Einfhrung in die Programmierung Vorlesung 5 2

Inhalt Teil 5:

Arrays Pointer Zweidimensionale Arrays

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 3

Statische Arrays
Ein Array ("Feld") speichert eine Menge von Daten gleichen Typs
"! Beispiel: 100 Messwerte eines Sensors

Statische Arrays haben eine fixe Gre, die bei der Deklaration angegeben werden muss [n] Zugriff ber Index zwischen 0 und n-1 Knnen bereits bei der Deklaration initialisiert werden
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 4

Beispiele mit statischen Arrays


double value[10]; // 10 function values int month_days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; char mask[8] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; int two_d[10][10]; // twodimensional array ... status |= mask[5]; // set bit #5 ... two_d[5][8] += 5; ... for (count = 0; count < 10; count++) // fill function values value[count] = count * count; ... if (leap_year) month_days[2] = 29; // wrong !!
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 5

Fallen
Arrays werden nicht implizit auf einen Wert initialisiert
"! muss explizit gemacht werden ( { .., .., ...} )

"index out of bounds error"


"! "! "! "! Wenn der index kleiner als 0 oder grer als n-1 wird Fhrt zu Absturz oder "beliebigem" Fehlverhalten des Programmes Keine berprfung durch Compiler oder zur Laufzeit Der Programmierer ist verantwortlich !!!

"off-by-one error"

"! Der Index beginnt bei 0 (nicht 1 !) "! Der Index endet bei n-1 (nicht n !) "! Siehe leap_year Beispiel auf der vorigen Folie
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 6

Beispiel fr Arrays

5_array_demo.c

file icon (cc) by Untergunter from http://www.iconarchive.com/show/leaf-mimes-icons-by-untergunter/text-x-c-icon.html

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 7

Pointer (=Reference, Zeiger, Verweis)


Ist die Adresse (=Nummer der Speicherstelle), an der sich eine Variable befindet Diese Adresse kann selbst wiederum in einer Variablen gespeichert werden (sog. Pointer-Variable)

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 8

Pointer Operatoren
Der & (address-of) Operator liefert die Adresse einer Variablen Der * (dereference) Operator liefert die Variable an der angegebenen Adresse Deklaration von Pointer-Variablen geschieht ebenfalls mit *

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 9

Beispiel fr Pointer

5_pointer_demo.c

file icon (cc) by Untergunter from http://www.iconarchive.com/show/leaf-mimes-icons-by-untergunter/text-x-c-icon.html

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 10

Ein Beispiel
number

123

1 // pointer_demo.c pointer 0x22cce4 2 // shows & and * operators 3 4 #include <stdio.h> 5 6 int main() 7 { 8 int number = 123; 9 int *pointer = &number; 10 11 printf("Number at %p is %d\n", pointer, *pointer); 12 *pointer = 456; 13 printf("Number is now %d\n", number); 14 printf("Number is also %d\n", *(&number)); 15 return 0; 16 DI Dr. } Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 11

Eine Anwendung: Call-by-Reference


// transforms time in seconds since midnight to h:m:s void calculateHourMinuteSecond(int time, int *hours, int *minutes, int *seconds) { *hours = time / 3600; *minutes = time / 60 *hours * 60; *seconds = time % 60; } ... int hour, minute, second; calculateHourMinuteSecond(12345, &hour, & minute, &second); printf("%02d:%02d:%02d", hour, minute, second);

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 12

Pointer-Arithmetik
Auch mit Pointern kann gerechnet werden Besonders oft: Addition von Pointer + Integer Array-Variable ist automatisch Pointer (=Startadresse) "! kein * bei der Deklaration "! array ist dasselbe wie &(array[0])

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 13

Pointer-Arithmetik
Dadurch Zugriff auf Arrays auch ber Pointer mglich array[index] ist dasselbe wie *(array+index) Die Gre der Elemente wird automatisch bercksichtigt Sehr effizient durch Hardware ausfhrbar Keine automatische berprfung der Array-Grenzen (!!!) Zugriff auf NULL-Pointer (=0) "Segmentation Fault "

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 14

Visuelles Beispiel
int square[10] = { 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 }; square
0 1 4 9 16

&square[0]

square+5

25 36 49 64 81

&square[5]

&square[10]
DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 15

Beispiel: Berechnung der Fibonacci Folge

5_static_array.c

file icon (cc) by Untergunter from http://www.iconarchive.com/show/leaf-mimes-icons-by-untergunter/text-x-c-icon.html

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 16

Zweidimensionale Arrays
Array von Arrays Beispiel: Je 100 Messwerte von 5 Sensoren

a0,0 a0,1 a1,0 a1,1 a2,0 a2,1 a3,0 a3,1 a4,0 a4,1

a0,2 a1,2 a2,2 a3,2 a4,2

a0,3 a1,3 a2,3 a3,3 a4,3

a0,4 .. a0,99 a1,4 .. a1,99 a2,4 .. a2,99 a3,4 .. a3,99 a4,4 .. a4,99

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 17

Deklaration
int matrix[rows][columns];

columns
1 2 6 10 3 7 11 4 8 12

rows
DI Dr. Christian Safran, IICM

5 9

Einfhrung in die Programmierung Vorlesung 5 18

Initialisierung
int matrix[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};

columns
1 2 6 10 3 7 11 4 8 12

rows

5 9

matrix[1][3]

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 19

Im Speicher
Ein durchgehender Block Je eine Zeile nach der anderen

row1
1 2 3 4

|
5

row2
6 7 8

|
...

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 20

Adressen
matrix: pointer auf erstes Element matrix[1]: pointer auf zweite Reihe

row1
1 2 3 4

|
5

row2
6 7 8

|
...

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 21

Adressierungsmglichkeiten
matrix[i][j] ist das selbe wie:
"! *(matrix[i] + j) "! (*(matrix + i))[j] "! *((*(matrix + i)) + j) "! *(&matrix[0][0] + 4*i + j)

row1
1 2 3 4

|
5

row2
6 7 8

|
...

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 22

Beispiel

5_2dim_array.c

file icon (cc) by Untergunter from http://www.iconarchive.com/show/leaf-mimes-icons-by-untergunter/text-x-c-icon.html

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 23

4. Hausbung
Arrays "! Drehe eine 4x4 Matrix um 90 nach rechts

a11 a21 a31 a41

a12 a22 a32 a42

a13 a23 a33 a43

a14 a24 a34 a44

a41 a42 a43 a44

a31 a32 a33 a34

a21 a22 a23 a24

a11 a12 a13 a14

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 24

4. Hausbung
4 verschiedene Matrizen

o -

o o -

o -

o -

o o -

o -

o o o

o o o o

-! -! -! -!

DI Dr. Christian Safran, IICM

Einfhrung in die Programmierung Vorlesung 5 25

4. Hausbung
Aufgabenstellung im Wiki
"! Halten Sie sich genau an die Anforderungen! "! Ihre Abgabe wird automatisiert getestet. "! Feedback: Anzahl der bestandenen Testflle.

Fragen von allgemeinem Interesse


"! Newsgroup tu-graz.lv.ep "! Zuerst lesen, dann posten

DI Dr. Christian Safran, IICM