c (3)

17
Περιεχόμενα Δείκτες (Παραδείγματα) Δομές (structures) Δομές που Περιέχουν Δομές Δομές και Συναρτήσεις Δομές που Περιέχουν Διατάξεις Διατάξεις Δομών Δομές και Δείκτες

Upload: alexisthe

Post on 28-Nov-2015

3 views

Category:

Documents


1 download

DESCRIPTION

σημειώσεις

TRANSCRIPT

Page 1: C (3)

Περιεχόμενα

• Δείκτες (Παραδείγματα)

• Δομές (structures)

• Δομές που Περιέχουν Δομές

• Δομές και Συναρτήσεις

• Δομές που Περιέχουν Διατάξεις

• Διατάξεις Δομών

• Δομές και Δείκτες

Page 2: C (3)

Δείκτες σε πίνακες (1)

Παράδειγμα:

int *p; int i; p = (int *)malloc(sizeof(int[10])); for (i=0; i<10; i++) p[i] = 0; free(p);

============== Or ===============

int *p; int i; p = (int *)malloc(sizeof(int[10])); for (i=0; i<10; i++) *(p+i) = 0; free(p);

Page 3: C (3)

Δείκτες σε δείκτες (2) Παράδειγμα:

int **p;

int *q;

p = (int **)malloc(sizeof(int*));

*p = (int *)malloc(sizeof(int));

**p = 12;

q = *p;

printf("%d\n", *q);

free(q);

free(p);

Οι δείκτες σε δείκτες χρησιμοποιούνται συχνά στη C για τη διαχείριση δεικτών μέσα σε συναρτήσεις.

Page 4: C (3)

Δείκτες σε δείκτες (3) #include <stdio.h>

#include <stdlib.h>

#define ROWS 10

#define COLUMNS 20

void main() {

int i, j;

int **p;

p = (int **)malloc( ROWS*sizeof( int* ) );

for (i=0; i < ROWS; i++)

p[i] = (int *)malloc( COLUMNS*sizeof( int ) );

for (i=0; i< ROWS; i++)

for (j=0; j < COLUMNS; j++ )

p[i][j] = 0;

for (i=0; i < ROWS; i++) {

printf("\n");

for (j=0; j<COLUMNS; j++ )

printf("%d ", p[i][j]);

}

}

Page 5: C (3)

Δομές Μία δομή είναι συλλογή από μία ή περισσότερες μεταβλητές,

πιθανώς διαφορετικών τύπων, που ομαδοποιούνται με ένα όνομα για ευκολία στο χειρισμό τους

Η δεσμευμένη λέξη struct εισάγει μια δήλωση δομής, που είναι μια λίστα δηλώσεων κλεισμένων σε άγκιστρα

Η λέξη struct μπορεί να ακολουθείται προαιρετικά από ένα όνομα που αποκαλείται ετικέτα δομής (structure tag)

Η ετικέτα “ονοματίζει” αυτό το είδος της δομής, και στη συνέχεια μπορεί να χρησιμοποιείται σαν συντομογραφία για το μέρος της δήλωσης που είναι μέσα στα άγκιστρα

Οι μεταβλητές που κατανομάζονται σε μια δομή λέγονται μέλη (members)

Page 6: C (3)

Δομές Παράδειγμα ορισμού (δε δεσμεύει χώρο μνήμης,

περιγράφει το πρότυπο)

struct point {

int x;

int y;

};

Παράδειγμα δήλωσης struct point {

int x;

int y;

} firstPt, secondPt;

Παράδειγμα δήλωσης struct point firstPt, secondPt;

Παράδειγμα δήλωσης και αρχικοποίησης struct point maxpt = {320, 200};

Page 7: C (3)

Δομές

Η αναφορά σε ένα μέλος μιας συγκεκριμένης δομής μέσα σε μια παράσταση γίνεται με μια κατασκευή του τύπου:

Μεταβλητή-δομής.μέλος

Παραδείγματα:

struct point firstPt;

struct point secondPt = {5, 10}; //ορισμός και αρχικοποίηση

firstPt.x = 10;

firstPt.y = 20;

printf( “%d, %d”, firstPt.x, firstPt.y);

firstPt = secondPt;

printf( “%d, %d”, firstPt.x, firstPt.y);

Page 8: C (3)

Οι δομές μπορεί να είναι αλληλένθετες, δηλαδή να περιέχουν άλλες δομές ως μέλη

Παράδειγμα: Μια αναπαράσταση ορθογωνίου είναι ένα ζευγάρι σημείων που

αντιπροσωπεύουν τις διαγώνια απέναντι κορυφές του:

Δομές που Περιέχουν Δομές

x

y pt2

pt1

struct rect {

struct point pt1;

struct point pt2;

};

struct rect screen;

screen.pt1.x =0; // αναφέρεται στη συντεταγμένη x του μέλους pt1 της screen

Page 9: C (3)

Δομές και Συναρτήσεις (1)

Οι μόνες επιτρεπτές πράξεις πάνω σε μια δομή είναι: η αντιγραφή της, η απόδοση τιμής σε αυτήν σαν σύνολο, η εξαγωγή της διεύθυνσής της με & και η προσπέλαση των μελών της

Η αντιγραφή και απόδοση τιμής περιλαμβάνουν τη μεταβίβαση ορισμάτων σε συναρτήσεις και την επιστροφή τιμών από συναρτήσεις

Οι δομές δεν μπορούν να συγκριθούν

Page 10: C (3)

Δομές και Συναρτήσεις (2)

Υπάρχουν τουλάχιστον τρεις δυνατές προσεγγίσεις για την μεταβίβαση μιας δομής ως όρισμα σε μια συνάρτηση:

Η μεταβίβαση των μελών της ξεχωριστά

Η μεταβίβαση ολόκληρης της δομής

Η μεταβίβαση ενός δείκτη γι’ αυτήν

Page 11: C (3)

Δομές και Συναρτήσεις (3) Μεταβίβαση των μελών της δομής Παράδειγμα 1:

struct point {

int x;

int y;

}; struct point makepoint( int x, int y) { struct point temp; temp.x = x; temp.y = y; return temp; } struct point pt1, pt2, mypt; pt1 = makepoint(0,0); // χρήση της makepoint για απόδοση αρχικής

τιμής σε δομή pt2 = makepoint(-1, -1); // το ίδιο mypt = makepoint((pt1.x+pt2.x),(pt1.y+pt2.y)) // το ίδιο

Page 12: C (3)

Δομές και Συναρτήσεις (4) Μεταβίβαση ολόκληρης της δομής Παράδειγμα2:

struct point addpoint( struct point p1, struct point p2) {

p1.x += p2.x; p1.y += p2.y; return p1; } struct point sum; sum = addpoint(makepoint(1, 1), makepoint(-1, -1));

// χρήση της makepoint για τη διάθεση ορισμάτων τύπου δομής σε μια συνάρτηση

Page 13: C (3)

Δομές και Συναρτήσεις (5) Αν μια μεγάλη δομή πρόκειται να μεταβιβαστεί σε μια

συνάρτηση, γενικά είναι αποτελεσματικότερη η μεταβίβαση ενός δείκτη και όχι η αντιγραφή ολόκληρης της δομής

Οι δείκτες για δομές είναι όπως ακριβώς και οι δείκτες για κανονικές μεταβλητές

Η δήλωση struct point* ptr λεει ότι:

Ο ptr είναι δείκτης για μια δομή τύπου struct point

Αν o ptr δείχνει μια δομή point τότε *ptr είναι η ίδια η δομή

(*ptr).x και (*ptr).y είναι τα μέλη

Οι δείκτες για δομές χρησιμοποιούνται τόσο συχνά, ώστε να παρέχεται ένα εναλλακτικός συμβολισμός σαν συντομογραφία. Αν p είναι δείκτης σε δομή, τότε η

p->μέλος-της-δομής

αναφέρεται στο συγκεκριμένο μέλος

(*ptr).x ισοδύναμο με το ptr->x

Page 14: C (3)

Δομές που Περιέχουν Διατάξεις

Μπορούμε να ορίσουμε μία δομή η οποία να περιέχει μία ή

περισσότερες διατάξεις ως μέλη

Η διάταξη μπορεί να είναι οποιουδήποτε τύπου δεδομένων της

C (int, char, κλπ)

Παράδειγμα: struct data {

int x[6];

char y[10];

};

struct data record;

record.x[2] = 10;

record.y[1] = ‘x’; // η έκφραση record.y είναι ένα δείκτης στο πρώτο στοιχείο της διάταξης

// y[] στη δομή record

record

x y

Page 15: C (3)

Διατάξεις Δομών Μπορούμε να ορίσουμε μία διάταξη η οποία να περιέχει

δομές

Παράδειγμα:

struct data list [100]

Δηλώνει μία διάταξη με το όνομα list η οποία περιέχει 100 στοιχεία

Κάθε στοιχείο είναι μια δομή τύπου data

list[0] {

list[1] {

list[99] {

list[0].x

list[0].y

Page 16: C (3)

Δομές και Δείκτες (1) Μπορούμε να δηλώσουμε δείκτες σε δομές και να χρησιμοποιήσουμε

δείκτες ως μέλη δομών

Παράδειγμα 1 (δείκτες σε δομές):

struct record {

char name[30];

char city[30];

char country[20];

};

struct record *pRec;

struct record rec = {“George Anestis”, “Chania”, “Greece”};

pRec = &rec;

printf(“Name: %s City: %s Country: %s\n”, (*pRec).name, pRec->city, (*pRec).country);

Page 17: C (3)

Δομές και Δείκτες (2)

Παράδειγμα 2 (δυναμική δημιουργία δομής):

struct record *pRec;

pRec = (struct record*)malloc(sizeof(struct record));

strcpy(pRec->name, “Fotis Kazasis”);

strcpy(pRec->city, “Chania”);

strcpy( (*pRec).country, “Greece”);

printf(“Name: %s City: %s Country: %s\n”, (*pRec).name, pRec->city, (*pRec).country);

pRec name

city

country