c (3)
DESCRIPTION
σημειώσειςTRANSCRIPT
Περιεχόμενα
• Δείκτες (Παραδείγματα)
• Δομές (structures)
• Δομές που Περιέχουν Δομές
• Δομές και Συναρτήσεις
• Δομές που Περιέχουν Διατάξεις
• Διατάξεις Δομών
• Δομές και Δείκτες
Δείκτες σε πίνακες (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);
Δείκτες σε δείκτες (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 για τη διαχείριση δεικτών μέσα σε συναρτήσεις.
Δείκτες σε δείκτες (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]);
}
}
Δομές Μία δομή είναι συλλογή από μία ή περισσότερες μεταβλητές,
πιθανώς διαφορετικών τύπων, που ομαδοποιούνται με ένα όνομα για ευκολία στο χειρισμό τους
Η δεσμευμένη λέξη struct εισάγει μια δήλωση δομής, που είναι μια λίστα δηλώσεων κλεισμένων σε άγκιστρα
Η λέξη struct μπορεί να ακολουθείται προαιρετικά από ένα όνομα που αποκαλείται ετικέτα δομής (structure tag)
Η ετικέτα “ονοματίζει” αυτό το είδος της δομής, και στη συνέχεια μπορεί να χρησιμοποιείται σαν συντομογραφία για το μέρος της δήλωσης που είναι μέσα στα άγκιστρα
Οι μεταβλητές που κατανομάζονται σε μια δομή λέγονται μέλη (members)
Δομές Παράδειγμα ορισμού (δε δεσμεύει χώρο μνήμης,
περιγράφει το πρότυπο)
struct point {
int x;
int y;
};
Παράδειγμα δήλωσης struct point {
int x;
int y;
} firstPt, secondPt;
Παράδειγμα δήλωσης struct point firstPt, secondPt;
Παράδειγμα δήλωσης και αρχικοποίησης struct point maxpt = {320, 200};
Δομές
Η αναφορά σε ένα μέλος μιας συγκεκριμένης δομής μέσα σε μια παράσταση γίνεται με μια κατασκευή του τύπου:
Μεταβλητή-δομής.μέλος
Παραδείγματα:
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);
Οι δομές μπορεί να είναι αλληλένθετες, δηλαδή να περιέχουν άλλες δομές ως μέλη
Παράδειγμα: Μια αναπαράσταση ορθογωνίου είναι ένα ζευγάρι σημείων που
αντιπροσωπεύουν τις διαγώνια απέναντι κορυφές του:
Δομές που Περιέχουν Δομές
x
y pt2
pt1
struct rect {
struct point pt1;
struct point pt2;
};
struct rect screen;
screen.pt1.x =0; // αναφέρεται στη συντεταγμένη x του μέλους pt1 της screen
Δομές και Συναρτήσεις (1)
Οι μόνες επιτρεπτές πράξεις πάνω σε μια δομή είναι: η αντιγραφή της, η απόδοση τιμής σε αυτήν σαν σύνολο, η εξαγωγή της διεύθυνσής της με & και η προσπέλαση των μελών της
Η αντιγραφή και απόδοση τιμής περιλαμβάνουν τη μεταβίβαση ορισμάτων σε συναρτήσεις και την επιστροφή τιμών από συναρτήσεις
Οι δομές δεν μπορούν να συγκριθούν
Δομές και Συναρτήσεις (2)
Υπάρχουν τουλάχιστον τρεις δυνατές προσεγγίσεις για την μεταβίβαση μιας δομής ως όρισμα σε μια συνάρτηση:
Η μεταβίβαση των μελών της ξεχωριστά
Η μεταβίβαση ολόκληρης της δομής
Η μεταβίβαση ενός δείκτη γι’ αυτήν
Δομές και Συναρτήσεις (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)) // το ίδιο
Δομές και Συναρτήσεις (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 για τη διάθεση ορισμάτων τύπου δομής σε μια συνάρτηση
Δομές και Συναρτήσεις (5) Αν μια μεγάλη δομή πρόκειται να μεταβιβαστεί σε μια
συνάρτηση, γενικά είναι αποτελεσματικότερη η μεταβίβαση ενός δείκτη και όχι η αντιγραφή ολόκληρης της δομής
Οι δείκτες για δομές είναι όπως ακριβώς και οι δείκτες για κανονικές μεταβλητές
Η δήλωση struct point* ptr λεει ότι:
Ο ptr είναι δείκτης για μια δομή τύπου struct point
Αν o ptr δείχνει μια δομή point τότε *ptr είναι η ίδια η δομή
(*ptr).x και (*ptr).y είναι τα μέλη
Οι δείκτες για δομές χρησιμοποιούνται τόσο συχνά, ώστε να παρέχεται ένα εναλλακτικός συμβολισμός σαν συντομογραφία. Αν p είναι δείκτης σε δομή, τότε η
p->μέλος-της-δομής
αναφέρεται στο συγκεκριμένο μέλος
(*ptr).x ισοδύναμο με το ptr->x
Δομές που Περιέχουν Διατάξεις
Μπορούμε να ορίσουμε μία δομή η οποία να περιέχει μία ή
περισσότερες διατάξεις ως μέλη
Η διάταξη μπορεί να είναι οποιουδήποτε τύπου δεδομένων της
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
Διατάξεις Δομών Μπορούμε να ορίσουμε μία διάταξη η οποία να περιέχει
δομές
Παράδειγμα:
struct data list [100]
Δηλώνει μία διάταξη με το όνομα list η οποία περιέχει 100 στοιχεία
Κάθε στοιχείο είναι μια δομή τύπου data
list[0] {
list[1] {
list[99] {
list[0].x
list[0].y
Δομές και Δείκτες (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);
Δομές και Δείκτες (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