Δημοσιεύτηκε: 01 Φεβ 2012, 16:05
Βασικά όλα αυτά τα έχουμε αναλύσει και στο παρελθόν, ενώ τα περισσότερα από αυτά τα αναλύω και στο site μου (στα links της υπογραφής μου). Και βασικά σου χρειάζονται να τα ξέρεις προκειμένου να μπορέσεις να υλοποιήσεις αντιμετάθεση πινάκων μέσω δεικτών και όχι μέσω αντιγραφής των στοιχείων τους ένα-ένα 
Εν τάχει, ξεκινώντας από την ερώτηση για το &head, πρόκειται ουσιαστικά για by-reference πέρασμα του δείκτη head στην list_prepend() διότι η συνάρτηση μετακινεί τον δείκτη head μέσα της και θέλω να ξέρω που πήγε ο δείκτης όταν επιστρέψει η συνάρτηση.
Σε ότι αφορά τους πίνακες τώρα (το ίδιο είναι και για τα c-strings), το όνομά τους είναι δείκτης στο 1ο τους στοιχείο, και ως τέτοιος μπορεί να χρησιμοποιηθεί είτε ως *array_name είτε ως array_name[0] για πρόσβαση στην τιμή που περιέχει ο πίνακας στο 1ο του στοιχείο.
Αυτό όμως που ΔΕΝ μπορούμε να κάνουμε στα ονόματα πινάκων, όταν έχουν οριστεί σαν πίνακες, είναι να τα διαχειριστούμε ως LVALUES (δεν μπορούμε δηλαδή να τους μετακινήσουμε σε άλλη θέση).
Για να μπορείς να διαχειριστείς ένα δείκτη και ως LVALUE πρέπει υποχρεωτικά να έχει οριστεί ως δείκτης...
και όχι ως πίνακας...
Αυτό ακριβώς είναι και το κλειδί για να μπορέσεις να υλοποιήσεις αντιμετάθεση πινάκων μέσω δεικτών
Συν μερικά ακόμα, που καλείσαι να τα βρεις στη πορεία (π.χ. δεν αρκεί μονάχα να αντιμεταθέσεις τους δείκτες των πινάκων, πρέπει να αντιμεταθέσεις με κάποιον τρόπο και τα μέγιστα μήκη τους... άντε, την είπα την μισή άσκηση και παραπάνω
)
Εν τάχει, ξεκινώντας από την ερώτηση για το &head, πρόκειται ουσιαστικά για by-reference πέρασμα του δείκτη head στην list_prepend() διότι η συνάρτηση μετακινεί τον δείκτη head μέσα της και θέλω να ξέρω που πήγε ο δείκτης όταν επιστρέψει η συνάρτηση.
Σε ότι αφορά τους πίνακες τώρα (το ίδιο είναι και για τα c-strings), το όνομά τους είναι δείκτης στο 1ο τους στοιχείο, και ως τέτοιος μπορεί να χρησιμοποιηθεί είτε ως *array_name είτε ως array_name[0] για πρόσβαση στην τιμή που περιέχει ο πίνακας στο 1ο του στοιχείο.
Αυτό όμως που ΔΕΝ μπορούμε να κάνουμε στα ονόματα πινάκων, όταν έχουν οριστεί σαν πίνακες, είναι να τα διαχειριστούμε ως LVALUES (δεν μπορούμε δηλαδή να τους μετακινήσουμε σε άλλη θέση).
Για να μπορείς να διαχειριστείς ένα δείκτη και ως LVALUE πρέπει υποχρεωτικά να έχει οριστεί ως δείκτης...
- Κώδικας: Επιλογή όλων
int *array = NULL;
και όχι ως πίνακας...
- Κώδικας: Επιλογή όλων
int array[ARRLEN ] = {0};
Αυτό ακριβώς είναι και το κλειδί για να μπορέσεις να υλοποιήσεις αντιμετάθεση πινάκων μέσω δεικτών