Προς το περιεχόμενο

Πρόβληματάκια στην κατανόηση των pointers...!


loxagos_snake

Προτεινόμενες αναρτήσεις

Δημοσ.

Λοιπόν δεν νομίζω πως όσοι εχετε ασχοληθεί με προγραμματισμό θεωρείτε τους δείκτες εύκολους!!!

 

Έχω διαβάσει τα αντίστοιχα αρθράκια από cprogramming.com και cplusplus.com. Έχω βιβλίο για την C++. Το έχω συζητήσει με τον καθηγητή Πληροφορικής στο σχολειο...αλλα αυτοί οι δείκτες μου φέρνουν πονοκέφαλο!!!

 

Στην πραγματικότητα έχω καταλάβει ΤΙ κάνουν. Για να γίνω πιο συγκεκριμένος, ορίστε τι ξέρω:

 

-Οι δείκτες είναι μεταβλητές που κρατούν ("δείχνουν") τη διεύθυνση μιας άλλης μεταβλητής (ή πίνακα) στη μνήμη.

- Δηλώνονται έτσι: (π.χ. int *pointer) με πιθανή αρχικοποίηση. Αντίστοιχα για πίνακα.

-Αυτό ( pointer =&variable) δίνει στον δείκτη την διεύθυνση της μεταβλητής variable (referencing)

-Αυτό (pointer =*variable) δίνει στον δείκτη την ΤΙΜΗ της. (dereferencing).

 

Βέβαια εμένα το πρόβλημα μου είναι κυρίως το ΠΩΣ χρησιμοποιούνται...ξέρω ότι αξιοποιούνται σε δομές δεδομένων όπως δυαδικά δέντρα, στοίβες κ.τ.λ. αλλά και πάλι αυτά τα πράγματα μου είναι κάπως άγνωστα...!

 

Επίσης λίγο "χάνω" από τα new και delete!!! Πραγματικά παιδιά, συγγνώμη που είμαι ασαφής, αλλά βλέπω διάφορα για δείκτες σε συναρτήσεις, δείκτες σε άλλους δείκτες...και...έχω καταμπερδευτεί! Δεν ξέρω!!! Σας παρακαλώ, θα ήθελα να προσπαθήσετε να μου τα εξηγήσετε σε περισσότερο βάθος ή να μου δώσετε μια κατεύθυνση...έχω όλη τη διαθεση να ασχοληθώ όσο χρειαστεί για να το καταλάβω!!!

 

Ευχαριστώ! :-)

Δημοσ.

Για να τα καταλάβεις, θα πρέπει να τα χρησιμοποιήσεις, και για να τα χρησιμοποιήσεις θα πρέπει να τα χρειαστείς. Και για να χρειαστείς pointers θα πρέπει το πρόγραμμα σου να έχει "αυξημένες" απαιτήσεις. ΤΟΤΕ, και αφού θα έχεις αποκτήσει μια Α εμπειρία στον προγραμματισμό, θα μπορείς "πραγματικά" να καταλάβεις την έννοια του pointer.

 

Σαν μια γενική ιδέα, Ο,ΤΙΔΗΠΟΤΕ χρειάζεται ο υπολογιστής, θα πρέπει να το αποθηκεύσει, έστω προσωρινά, στη μνήμη. Το σημείο στη μνήμη είναι ο pointer. Συνήθως βάζεις μια "ταμπέλα" σε αυτό το σημείο, λέγοντας ότι είναι η μεταβλητή x ή η procedure DoSomething. Κάποιες φορές όμως χρειάζεται να προσπελάσεις τη μνήμη αυτή, ΧΩΡΙΣ να ξέρεις το όνομα της ταμπέλας. ΤΟΤΕ θα πρέπει να βρεις τον pointer από τη μνήμη που σε ενδιαφέρει, από κάπου "άσχετα" όπου χρησιμοποιείται.

 

πχ Αν θες να κάνεις ότι κάνει όταν πατήσεις το κουμπί aButton, τότε μπορείς να καλέσειςτον pointer της σχετικής συνάρτησης που φυλάσεται στο aButton.OnClick και να τρέξεις τη συνάρτηση με "δικές" σου παραμέτρους

Δημοσ.
Λοιπόν δεν νομίζω πως όσοι εχετε ασχοληθεί με προγραμματισμό θεωρείτε τους δείκτες εύκολους!!!

 

Έχω διαβάσει τα αντίστοιχα αρθράκια από cprogramming.com και cplusplus.com. Έχω βιβλίο για την C++. Το έχω συζητήσει με τον καθηγητή Πληροφορικής στο σχολειο...αλλα αυτοί οι δείκτες μου φέρνουν πονοκέφαλο!!!

 

Στην πραγματικότητα έχω καταλάβει ΤΙ κάνουν. Για να γίνω πιο συγκεκριμένος, ορίστε τι ξέρω:

 

-Οι δείκτες είναι μεταβλητές που κρατούν ("δείχνουν") τη διεύθυνση μιας άλλης μεταβλητής (ή πίνακα) στη μνήμη.

- Δηλώνονται έτσι: (π.χ. int *pointer) με πιθανή αρχικοποίηση. Αντίστοιχα για πίνακα.

-Αυτό ( pointer =&variable) δίνει στον δείκτη την διεύθυνση της μεταβλητής variable (referencing)

-Αυτό (pointer =*variable) δίνει στον δείκτη την ΤΙΜΗ της. (dereferencing).

 

Βέβαια εμένα το πρόβλημα μου είναι κυρίως το ΠΩΣ χρησιμοποιούνται...ξέρω ότι αξιοποιούνται σε δομές δεδομένων όπως δυαδικά δέντρα, στοίβες κ.τ.λ. αλλά και πάλι αυτά τα πράγματα μου είναι κάπως άγνωστα...!

 

Επίσης λίγο "χάνω" από τα new και delete!!! Πραγματικά παιδιά, συγγνώμη που είμαι ασαφής, αλλά βλέπω διάφορα για δείκτες σε συναρτήσεις, δείκτες σε άλλους δείκτες...και...έχω καταμπερδευτεί! Δεν ξέρω!!! Σας παρακαλώ, θα ήθελα να προσπαθήσετε να μου τα εξηγήσετε σε περισσότερο βάθος ή να μου δώσετε μια κατεύθυνση...έχω όλη τη διαθεση να ασχοληθώ όσο χρειαστεί για να το καταλάβω!!!

 

Ευχαριστώ! :-)

 

Μεταβλητες ειναι. Τιποτα περισσοτερο.

Δημοσ.
Για να τα καταλάβεις, θα πρέπει να τα χρησιμοποιήσεις, και για να τα χρησιμοποιήσεις θα πρέπει να τα χρειαστείς.

 

Συμφωνώ μαζί σου, όντως, ακόμα γράφω κυρίως αλγορίθμους και όχι προγράμματα με πολλές δυνατότητες. Και πάλι όμως, υπάρχουν φορές που για παράδειγμα θέλω να χρησιμοποιήσω έναν πίνακα μη σταθερού μεγέθους (π.χ. σε ένα text-based παιχνιδάκι που φτιάχνω -της πλάκας- θέλω να έχω έναν πίνακα χαρακτήρων Inventory, που θα τηρεί τα αντικείμενα σε μορφή συμβολοσειράς -π.χ. 'ΣΠΑΘΙ'. Αυτός θα ξεκινάει από 1 θέση γιατί θα έχει ένα αντικείμενο και κάθε φορά που θα παίρνω καινούργια αντικείμενα ή θα χρησιμοποιώ άλλα θα προσθέτει ή θα αφαιρει μια θέση. Ξέρω ότι μάλλον είναι αχρειάστο απο τη στιγμή που έχω 4GB RAM, αλλά προσπαθώ να κάνω εξάσκηση στο να φτιάχνω σταθερά προγράμματα!) και αυτό "μυρίζομαι" οτι θέλει δείκτες!!!

Δημοσ.

Η άνεση στη χρήση των δεικτών δεν αποκτάται με τον ορισμό τους.

Πρέπει να δεις περιπτώσεις χρήσης τους στην πράξη και αυτό δεν μπορεί να εξηγηθεί εδώ.

Όπως π.χ. στην Ανάλυση με το να μάθεις τον ορισμό του ολοκληρώματος δεν είσαι σε θέση να βρίσκεις ολοκληρώματα.

Πρέπει να δεις ένα πλήθος περιπτώσεων με τρόπους υπολογισμού τους.

 

Τα περισσότερα πράγματα που δεν αφορούν δομές δεδομένων μπορείς να τα κάνεις χωρίς ή με ελάχιστη χρήση δεικτών.

Εξάλλου σε κάποιες γλώσσες όπως η Java δομές δεδομένων στήνονται αποκλειστικά με αναφορές χωρίς καθόλου χρήση δεικτών.

Δες μόνον τις απλές περιπτώσεις και μην πονοκεφαλιάζεις με τις υπόλοιπες προς το παρόν.

Δημοσ.
Συμφωνώ μαζί σου, όντως, ακόμα γράφω κυρίως αλγορίθμους και όχι προγράμματα με πολλές δυνατότητες. Και πάλι όμως, υπάρχουν φορές που για παράδειγμα θέλω να χρησιμοποιήσω έναν πίνακα μη σταθερού μεγέθους (π.χ. σε ένα text-based παιχνιδάκι που φτιάχνω -της πλάκας- θέλω να έχω έναν πίνακα χαρακτήρων Inventory, που θα τηρεί τα αντικείμενα σε μορφή συμβολοσειράς -π.χ. 'ΣΠΑΘΙ'. Αυτός θα ξεκινάει από 1 θέση γιατί θα έχει ένα αντικείμενο και κάθε φορά που θα παίρνω καινούργια αντικείμενα ή θα χρησιμοποιώ άλλα θα προσθέτει ή θα αφαιρει μια θέση. Ξέρω ότι μάλλον είναι αχρειάστο απο τη στιγμή που έχω 4GB RAM, αλλά προσπαθώ να κάνω εξάσκηση στο να φτιάχνω σταθερά προγράμματα!) και αυτό "μυρίζομαι" οτι θέλει δείκτες!!!

 

Όσο περισσότερο χρησιμοποιείς δείκτες, τόσο πιο εύκολο είναι να ξεφύγεις και να τα κάνεις μπάχαλο. Οι compilers δεν μπορουν να ελεγξουν αν ο ο pointer είναι valid. Ότι του πεις θα πάει να το κάνει αλλά άν είναι λάθος ο pointer 8α το κάνει σε λάθος μέρος. Και αν είσαι τυχερός θα σκάσει κανά access violation και θα πας και θα το διορ8ωσεις. Αν όμως είσαι άτυχος, θα πάει και θα πειράξει άσχετα data, με αποτέλεσμα άλλες φορές να χτυπάει σε άσχετο σημείο και άλλες φορές όχι και εσύ θα φτάσεις να χτυπάς το κεφάλι σου.

 

Από πικρή εμπειρία: Αν υπάρχει άλλος τρόπος και αν δεν δημιουργείται πρόβλημα με μεγάλες καθυστερήσεις, άσε ήσυχους τους pointer για να έχεις την ησυχία σου.

Δημοσ.

Αμαν με τους pointers. Δεν ειναι τιποτα το τρομερο... ενα αστερακι ειναι. Αν ειναι να αποφευγει τους pointers στη c++ καλυτερα να αποφυγει τη c++. Δηαλδη η λυση σου ποια ειναι? Να ταϊζεις το cpu με 2-3gb stack?

 

loxagos_snake κατσε ασχολησου με τους pointers, εδω τους εμαθα εγω που ειμαι χομπιστας δε βλεπω το λογο να μην τους μαθεις.

Δημοσ.
... υπάρχουν φορές που για παράδειγμα θέλω να χρησιμοποιήσω έναν πίνακα μη σταθερού μεγέθους (π.χ. σε ένα text-based παιχνιδάκι που φτιάχνω -της πλάκας- θέλω να έχω έναν πίνακα χαρακτήρων Inventory, που θα τηρεί τα αντικείμενα σε μορφή συμβολοσειράς -π.χ. 'ΣΠΑΘΙ'. Αυτός θα ξεκινάει από 1 θέση γιατί θα έχει ένα αντικείμενο και κάθε φορά που θα παίρνω καινούργια αντικείμενα ή θα χρησιμοποιώ άλλα θα προσθέτει ή θα αφαιρει μια θέση. Ξέρω ότι μάλλον είναι αχρειάστο απο τη στιγμή που έχω 4GB RAM, αλλά προσπαθώ να κάνω εξάσκηση στο να φτιάχνω σταθερά προγράμματα!) και αυτό "μυρίζομαι" οτι θέλει δείκτες!!!

 

Ξέρω πώς γίνεται αυτό που λες αλλά άσκοπα παιδεύεσαι.

Μοιάζει κάπως σα να προσπαθείς να βρεις ένα ολοκλήρωμα με τον ορισμό.

Είναι καλύτερα να δεις πώς μπορείς να το κάνεις αυτό με την STL παρά με δείκτες, πρωτογενώς.

Με ρουτίνες της STL γίνεται πολύ πιο εύκολα, κατανοητά και με πολύ λιγότερο κίνδυνο λάθους...

Δημοσ.

Για να τα καταλάβεις, θα πρέπει να τα χρησιμοποιήσεις, και για να τα χρησιμοποιήσεις θα πρέπει να τα χρειαστείς. Και για να χρειαστείς pointers θα πρέπει το πρόγραμμα σου να έχει "αυξημένες" απαιτήσεις. ΤΟΤΕ, και αφού θα έχεις αποκτήσει μια Α εμπειρία στον προγραμματισμό, θα μπορείς "πραγματικά" να καταλάβεις την έννοια του pointer.

 

Σαν μια γενική ιδέα, Ο,ΤΙΔΗΠΟΤΕ χρειάζεται ο υπολογιστής, θα πρέπει να το αποθηκεύσει, έστω προσωρινά, στη μνήμη. Το σημείο στη μνήμη είναι ο pointer. Συνήθως βάζεις μια "ταμπέλα" σε αυτό το σημείο, λέγοντας ότι είναι η μεταβλητή x ή η procedure DoSomething. Κάποιες φορές όμως χρειάζεται να προσπελάσεις τη μνήμη αυτή, ΧΩΡΙΣ να ξέρεις το όνομα της ταμπέλας. ΤΟΤΕ θα πρέπει να βρεις τον pointer από τη μνήμη που σε ενδιαφέρει, από κάπου "άσχετα" όπου χρησιμοποιείται.

 

πχ Αν θες να κάνεις ότι κάνει όταν πατήσεις το κουμπί aButton, τότε μπορείς να καλέσειςτον pointer της σχετικής συνάρτησης που φυλάσεται στο aButton.OnClick και να τρέξεις τη συνάρτηση με "δικές" σου παραμέτρους

 

Λολ τωρα το ειδα τι σχεση εχουν οι allocators με τους pointer?

Δημοσ.

Δεν είπε κανείς ότι είναι κάτι τρομερό. Απλά ότι μπορεί εύκολα να οδηγήσει σε σφάλματα που συνήθως είναι δύσκολο να εντοπιστούν. Όπου μπορεί να τους αποφύγει ας τους αποφύγει. Όπου δεν μπορεί, και κάτι τρομερό να ήταν θα τους χρησιμοποιήσει.

Δημοσ.
Συμφωνώ μαζί σου, όντως, ακόμα γράφω κυρίως αλγορίθμους και όχι προγράμματα με πολλές δυνατότητες. Και πάλι όμως, υπάρχουν φορές που για παράδειγμα θέλω να χρησιμοποιήσω έναν πίνακα μη σταθερού μεγέθους (π.χ. σε ένα text-based παιχνιδάκι που φτιάχνω -της πλάκας- θέλω να έχω έναν πίνακα χαρακτήρων Inventory, που θα τηρεί τα αντικείμενα σε μορφή συμβολοσειράς -π.χ. 'ΣΠΑΘΙ'. Αυτός θα ξεκινάει από 1 θέση γιατί θα έχει ένα αντικείμενο και κάθε φορά που θα παίρνω καινούργια αντικείμενα ή θα χρησιμοποιώ άλλα θα προσθέτει ή θα αφαιρει μια θέση. Ξέρω ότι μάλλον είναι αχρειάστο απο τη στιγμή που έχω 4GB RAM, αλλά προσπαθώ να κάνω εξάσκηση στο να φτιάχνω σταθερά προγράμματα!) και αυτό "μυρίζομαι" οτι θέλει δείκτες!!!

 

Λάθος "μυρίζεσαι". Θέλεις απλά έναν container<string>, όπου container θα επιλέξεις εσύ ανάλογα με τις ανάγκες σου, πχ vector. Φτιάξε πρώτα το πρόγραμμά σου, κάντο να δουλεύει, και όταν δεις (που δε θα δεις) πως είναι αργό, τότε θα ψαχτείς.

Δημοσ.

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

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...