Δημοσιεύτηκε: 04 Ιούλ 2011, 19:40
Κάτι αρκετά (έως πολύ) προχωρημένο: εναλλαγή δυο δεικτών ανεξαρτήτως τύπου. Το βασικό που πρέπει να σημειωθεί είναι πως εναλλάσσει τους δείκτες αυτούς κάθε αυτούς και όχι αυτά στα οποία δείχνουν οι δείκτες.
Αυτό στην πράξη σημαίνει πως για να εναλλάξετε π.χ. δυο πίνακες από int πρέπει πρώτα να βάλετε 2 δείκτες να δείχνουν στους πίνακες, να εναλλάξετε τους δείκτες και στη συνέχεια να αναφέρεστε στους πίνακες μέσω αυτών των δεικτών (και όχι μέσω των ονομάτων των πινάκων).
Το ίδιο ακριβώς πρέπει να κάνετε αν έχετε 2 strings δηλωμένα ως πίνακες από χαρακτήρες, π.χ.: char s1[256] = "string-1", char s2[256] = "string-2";
Αυτό συμβαίνει διότι ότι είναι δηλωμένο ως πίνακας, ναι μεν το όνομα του αντιστοιχεί σε δείκτη που δείχνει στο 1ο στοιχείο του πίνακα, αλλά δεν μπορεί να χρησιμοποιηθεί ως lvalue. Με άλλα λόγια, είναι read-only. Για αυτό χρειάζεται πρώτα να ορίσετε έναν νέο δείκτη να δείχνει κι αυτός στην αρχή του πίνακα, και μετά αυτόν μπορείτε να τον βάλετε να δείξει κάπου αλλού.
Αντίθετα, αν τον πίνακα αντί να τον δηλώσετε εξαρχής ως πίνακα (δηλαδή με αγκύλες) τον ορίσετε ως κανονικό δείκτη και τον κάνετε κατόπιν malloc() / calloc() τότε μπορείτε να τον διαχειριστείτε απευθείας. Σε αυτές τις περιπτώσεις δουλεύει κανονικά η εναλλαγή χωρίς να χρειάζονται έξτρα δείκτες.
Αυτό στον κώδικα το δείχνω με την απευθείας εναλλαγή των: char *cpx και char *cpy που στην ουσία είναι strings, αλλά δεν τα έχω ορίσει ως πίνακες. Τα έχω ορίσει απευθείας ως δείκτες (και αντί για malloc() / calloc() τα έχω αρχικοποίησει με τιμές κατευθείαν κατά τον ορισμό τους).
Παραθέτω και τον κώδικα...
Αυτό στην πράξη σημαίνει πως για να εναλλάξετε π.χ. δυο πίνακες από int πρέπει πρώτα να βάλετε 2 δείκτες να δείχνουν στους πίνακες, να εναλλάξετε τους δείκτες και στη συνέχεια να αναφέρεστε στους πίνακες μέσω αυτών των δεικτών (και όχι μέσω των ονομάτων των πινάκων).
Το ίδιο ακριβώς πρέπει να κάνετε αν έχετε 2 strings δηλωμένα ως πίνακες από χαρακτήρες, π.χ.: char s1[256] = "string-1", char s2[256] = "string-2";
Αυτό συμβαίνει διότι ότι είναι δηλωμένο ως πίνακας, ναι μεν το όνομα του αντιστοιχεί σε δείκτη που δείχνει στο 1ο στοιχείο του πίνακα, αλλά δεν μπορεί να χρησιμοποιηθεί ως lvalue. Με άλλα λόγια, είναι read-only. Για αυτό χρειάζεται πρώτα να ορίσετε έναν νέο δείκτη να δείχνει κι αυτός στην αρχή του πίνακα, και μετά αυτόν μπορείτε να τον βάλετε να δείξει κάπου αλλού.
Αντίθετα, αν τον πίνακα αντί να τον δηλώσετε εξαρχής ως πίνακα (δηλαδή με αγκύλες) τον ορίσετε ως κανονικό δείκτη και τον κάνετε κατόπιν malloc() / calloc() τότε μπορείτε να τον διαχειριστείτε απευθείας. Σε αυτές τις περιπτώσεις δουλεύει κανονικά η εναλλαγή χωρίς να χρειάζονται έξτρα δείκτες.
Αυτό στον κώδικα το δείχνω με την απευθείας εναλλαγή των: char *cpx και char *cpy που στην ουσία είναι strings, αλλά δεν τα έχω ορίσει ως πίνακες. Τα έχω ορίσει απευθείας ως δείκτες (και αντί για malloc() / calloc() τα έχω αρχικοποίησει με τιμές κατευθείαν κατά τον ορισμό τους).
Παραθέτω και τον κώδικα...
Spoiler: show