migf1 Δημοσ. 15 Φεβρουαρίου 2012 Δημοσ. 15 Φεβρουαρίου 2012 Καλημέρα, επειδή έχασα λιγάκι την μπάλα (είναι μια από εκείνες τις περίεργες μέρες), μπορεί κάποιος να επιβεβαιώσει/διαψεύσει πως το... > char *const *const string; για δήλωση πίνακα από strings ισοδυναμεί σε λειτουργικότητα με το... > const char *string; για απλό string; To 2o σε αφήνει να αλλάξεις τον δείκτη αλλά όχι τα περιεχόμενα του string. Θέλω το ίδιο πράγμα αλλά για πίνακα από strings, δηλαδή να μπορώ να αλλάξω τον δείκτη του πίνακα, αλλά όχι τα περιεχόμενά του πίνακα.
imitheos Δημοσ. 15 Φεβρουαρίου 2012 Δημοσ. 15 Φεβρουαρίου 2012 Καλημέρα, επειδή έχασα λιγάκι την μπάλα (είναι μια από εκείνες τις περίεργες μέρες), μπορεί κάποιος να επιβεβαιώσει/διαψεύσει πως το... > char *const *const string; για δήλωση πίνακα από strings ισοδυναμεί σε λειτουργικότητα με το... > const char *string; για απλό string; To 2o σε αφήνει να αλλάξεις τον δείκτη αλλά όχι τα περιεχόμενα του string. Θέλω το ίδιο πράγμα αλλά για πίνακα από strings, δηλαδή να μπορώ να αλλάξω τον δείκτη του πίνακα, αλλά όχι τα περιεχόμενά του πίνακα. Η "char *const *const string" δεν δηλώνει constant pointer to constant pointer to char ? Δηλαδή το ανάποδο από αυτό που θέλεις εφόσον δεν μπορείς να αλλάξεις τον δείκτη ? ΑΝ κατάλαβα καλά τι θέλεις, ένα απλό const char **s δεν σου αρκεί ? Μπορούν να αλλαχτούν οι δείκτες αλλά δεν μπορείς να πεις s[0][0]='k'
migf1 Δημοσ. 15 Φεβρουαρίου 2012 Μέλος Δημοσ. 15 Φεβρουαρίου 2012 Βασικά δεν θέλω να μπορούν να αλλάξουν ούτε οι ας τους πούμε indexed-pointers του πίνακα (δηλαδή οι sarr[0], sarr[1], κλπ) αλλά να μπορεί να αλλάζει ο βασικός pointer του πίνακα, o sarr. ΥΓ. Ο πίνακας είναι δημιουργημένος δυναμικά, από: char **sarr;
Timonkaipumpa Δημοσ. 15 Φεβρουαρίου 2012 Δημοσ. 15 Φεβρουαρίου 2012 migf1 Στο πρώτο δεν μπορείς να αλλάξεις το πού δείχνουν οι δείκτες. Την περιοχή μνήμης δηλαδή στην οποία δείχνουν. Στο δεύτερο δεν μπορείς να αλλάξεις την τιμή της περιοχής μνήμης στην οποία δείχνει ο δείκτης. Δες αυτό: > #include <stdio.h> #include <stdlib.h> typedef const char * const pChar; typedef pChar* ppChar; /* * */ int main(int argc, char** argv) { pChar str1 = "Test\0"; pChar str2 = "Test2\0"; //str1 = "Test2\0"; ppChar testArr= (pChar*) malloc( sizeof(pChar)); int i; testArr = &str1; testArr = &str2; return (EXIT_SUCCESS); } Εάν κάνεις uncomment το str1 = "Test2\0"; θα δεις ότι δεν μπορεί να αλλάξει την τιμή. Κάτι τέτοιο ψάχνεις;
migf1 Δημοσ. 15 Φεβρουαρίου 2012 Μέλος Δημοσ. 15 Φεβρουαρίου 2012 Οπότε το 1ο κάνει αυτό που θέλω, ε; Δηλαδή να μπορείς να βάλεις τον sarr να δείχνει κάπου αλλού (να τον αλλάζεις δηλαδή) αλλά να μην μπορείς να αλλάζεις ούτε τους (sarr+i) ούτε τα *(sarr+i) ; EDIT: Βασικά το ... >char *const *const sarr; μου εξασφαλίζει αυτό που περιγράφω πως θέλω να κάνω;
Timonkaipumpa Δημοσ. 15 Φεβρουαρίου 2012 Δημοσ. 15 Φεβρουαρίου 2012 Θες ένα πίνακα που να μην μπορείς να αλλάξεις τα στοιχεία του, τα οποία είναι δείκτες. Σωστά; Δηλαδή, να μην μπορείς να αλλάξεις το πού δείχνουν οι δείκτες. > char * const theString; Εάν θες να μην μπορείς ούτε να αλλάξεις την τιμή της περιοχής μνήμης όπου δείχνουν οι δείκτες: > const char * const theString;
migf1 Δημοσ. 15 Φεβρουαρίου 2012 Μέλος Δημοσ. 15 Φεβρουαρίου 2012 EDIT2: Αφήστε το παίδες, θα το τεστάρω με κώδικα (έλεγα μήπως ήξερε κανείς απευθείας... τόση ώρα θα το είχα βρει ) Ευχαριστώ όμως για τις απαντήσεις!
Timonkaipumpa Δημοσ. 15 Φεβρουαρίου 2012 Δημοσ. 15 Φεβρουαρίου 2012 Οπότε το 1ο κάνει αυτό που θέλω, ε; Δηλαδή να μπορείς να βάλεις τον sarr να δείχνει κάπου αλλού (να τον αλλάζεις δηλαδή) αλλά να μην μπορείς να αλλάζεις ούτε τους (sarr+i) ούτε τα (*sarr+i) ; EDIT: Βασικά το ... >char *const *const sarr; μου εξασφαλίζει αυτό που περιγράφω πως θέλω να κάνω; Όχι. γιατί έτσι δεν θα μπορείς να αλλάξεις την τιμή του *sarr. Πώς θα προσπελάσεις τον πίνακά σου; Επίσης, μπορεί κανείς να χρησιμοποιήσει τον δείκτη σου (**sarr) για να αλλάξει τα strings αλλά όχι την τιμή του δείκτη. Δεν εξασφαλίζεις ότι δεν θα μπορούν να αλλαχθούν τα περιεχόμενα αλλά εξασφαλίζεις μόνο ότι το πού δείχνουν οι δείκτες δεν θα αλλάξει. Όχι όμως το τι περιέχεται εκεί που δείχνουν.
migf1 Δημοσ. 15 Φεβρουαρίου 2012 Μέλος Δημοσ. 15 Φεβρουαρίου 2012 Μισό timon να το τεστάρω με κώδικα και θα επανέλθω.. btw, έκανα edit στην παράθεση... από (*sarr+i) σε *(sarr+i)
Timonkaipumpa Δημοσ. 15 Φεβρουαρίου 2012 Δημοσ. 15 Φεβρουαρίου 2012 edit. Δες αυτό > typedef const char * const p1; typedef const p1 * p2; typedef p2 * p3; Όπου, με την πρώτη γραμμή εξασφαλίζεις ότι δεν αλλάζει ούτε το που δείχνουν ούτε η τιμή των δεικτών σε strings. Με την δεύτερη εξασφαλίζεις ότι δεν θα αλλάξει το πού δείχνουν οι δείκτες με την τρίτη φτιάχνεις έναν array από δείκτες της γραμμής 2. Εάν το γράψεις σε μία γραμμή, βάζοντας και το const πριν το char, δεν ξέρω εάν θα σε αφήσει.
migf1 Δημοσ. 15 Φεβρουαρίου 2012 Μέλος Δημοσ. 15 Φεβρουαρίου 2012 Με μπερδεύουν τα typedef αντί να με διευκολύνουν.
Timonkaipumpa Δημοσ. 15 Φεβρουαρίου 2012 Δημοσ. 15 Φεβρουαρίου 2012 ΟΚ. Σε αυτό που γράφεις: > char * const * const theString; το πρόβλημα είναι ότι μπορεί κανείς να αλλάξει την τιμή που θα έχει το block όπου θα δείχνει το **theSting. Αυτό εγγυάται ότι δεν αλλάζει τίποτα. > const char * const * const theString;
migf1 Δημοσ. 15 Φεβρουαρίου 2012 Μέλος Δημοσ. 15 Φεβρουαρίου 2012 Θέλω να αλλάζει το μπλοκ που δείχνει ο sarr. Αν έχω δηλαδή 2 πίνακες από strings sarr1 και sarr2, θέλω να μπορώ να τους κάνω π.χ. swap, δεν θέλω όμως να μπορούν να αλλάξουν ούτε τα sarr ούτε τα *(sarr) σε κανέναν από τους 2 πίνακες.
Timonkaipumpa Δημοσ. 15 Φεβρουαρίου 2012 Δημοσ. 15 Φεβρουαρίου 2012 Δοκίμασε αυτό: > const char * const * const *sarr; Ή με typedef > typedef const char * const * const innerPointers; typedef innerPointers* sarr; Edit Υ.Γ. Έκανα μία αλλαγή... αυτό είναι το σωστό στο πρώτο code /code block.
migf1 Δημοσ. 15 Φεβρουαρίου 2012 Μέλος Δημοσ. 15 Φεβρουαρίου 2012 Δεν δουλεύει Α έκανες edit? μισο...
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα