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

C: const pointer to const pointer


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

Δημοσ.

Καλημέρα,

 

επειδή έχασα λιγάκι την μπάλα (είναι μια από εκείνες τις περίεργες μέρες), μπορεί κάποιος να επιβεβαιώσει/διαψεύσει πως το...

 

>
char *const *const string;

για δήλωση πίνακα από strings ισοδυναμεί σε λειτουργικότητα με το...

 

>
const char *string;

για απλό string;

 

To 2o σε αφήνει να αλλάξεις τον δείκτη αλλά όχι τα περιεχόμενα του string. Θέλω το ίδιο πράγμα αλλά για πίνακα από strings, δηλαδή να μπορώ να αλλάξω τον δείκτη του πίνακα, αλλά όχι τα περιεχόμενά του πίνακα.

  • Απαντ. 32
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Συχνή συμμετοχή στο θέμα

Δημοσ.

Καλημέρα,

 

επειδή έχασα λιγάκι την μπάλα (είναι μια από εκείνες τις περίεργες μέρες), μπορεί κάποιος να επιβεβαιώσει/διαψεύσει πως το...

 

>
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'

Δημοσ.

Βασικά δεν θέλω να μπορούν να αλλάξουν ούτε οι ας τους πούμε indexed-pointers του πίνακα (δηλαδή οι sarr[0], sarr[1], κλπ) αλλά να μπορεί να αλλάζει ο βασικός pointer του πίνακα, o sarr.

 

ΥΓ. Ο πίνακας είναι δημιουργημένος δυναμικά, από: char **sarr;

Δημοσ.

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"; θα δεις ότι δεν μπορεί να αλλάξει την τιμή.

 

Κάτι τέτοιο ψάχνεις;

Δημοσ.

Οπότε το 1ο κάνει αυτό που θέλω, ε;

 

Δηλαδή να μπορείς να βάλεις τον sarr να δείχνει κάπου αλλού (να τον αλλάζεις δηλαδή) αλλά να μην μπορείς να αλλάζεις ούτε τους (sarr+i) ούτε τα *(sarr+i) ;

 

EDIT:

 

Βασικά το ...

 

>char *const *const sarr;

μου εξασφαλίζει αυτό που περιγράφω πως θέλω να κάνω;

Δημοσ.

Θες ένα πίνακα που να μην μπορείς να αλλάξεις τα στοιχεία του, τα οποία είναι δείκτες. Σωστά;

Δηλαδή, να μην μπορείς να αλλάξεις το πού δείχνουν οι δείκτες.

 

>
char * const theString;

 

Εάν θες να μην μπορείς ούτε να αλλάξεις την τιμή της περιοχής μνήμης όπου δείχνουν οι δείκτες:

 

>
const char * const theString;

Δημοσ.

EDIT2:

 

Αφήστε το παίδες, θα το τεστάρω με κώδικα (έλεγα μήπως ήξερε κανείς απευθείας... τόση ώρα θα το είχα βρει :lol:)

Ευχαριστώ όμως για τις απαντήσεις!

Δημοσ.

Οπότε το 1ο κάνει αυτό που θέλω, ε;

 

Δηλαδή να μπορείς να βάλεις τον sarr να δείχνει κάπου αλλού (να τον αλλάζεις δηλαδή) αλλά να μην μπορείς να αλλάζεις ούτε τους (sarr+i) ούτε τα (*sarr+i) ;

 

EDIT:

 

Βασικά το ...

 

>char *const *const sarr;

μου εξασφαλίζει αυτό που περιγράφω πως θέλω να κάνω;

 

Όχι.

 

γιατί έτσι δεν θα μπορείς να αλλάξεις την τιμή του *sarr.

 

Πώς θα προσπελάσεις τον πίνακά σου;

 

Επίσης, μπορεί κανείς να χρησιμοποιήσει τον δείκτη σου (**sarr) για να αλλάξει τα strings αλλά όχι την τιμή του δείκτη.

Δεν εξασφαλίζεις ότι δεν θα μπορούν να αλλαχθούν τα περιεχόμενα αλλά εξασφαλίζεις μόνο ότι το πού δείχνουν οι δείκτες δεν θα αλλάξει. Όχι όμως το τι περιέχεται εκεί που δείχνουν.

Δημοσ.

edit.

 

Δες αυτό

 

>
typedef const char * const p1;
typedef const p1 * p2;
typedef p2 * p3;

 

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

 

Με την δεύτερη εξασφαλίζεις ότι δεν θα αλλάξει το πού δείχνουν οι δείκτες

 

με την τρίτη φτιάχνεις έναν array από δείκτες της γραμμής 2.

 

 

Εάν το γράψεις σε μία γραμμή, βάζοντας και το const πριν το char, δεν ξέρω εάν θα σε αφήσει.

Δημοσ.

ΟΚ.

 

Σε αυτό που γράφεις:

 

>
char * const * const theString;

 

το πρόβλημα είναι ότι μπορεί κανείς να αλλάξει την τιμή που θα έχει το block όπου θα δείχνει το **theSting.

 

Αυτό εγγυάται ότι δεν αλλάζει τίποτα.

 

>
const char * const * const theString;

Δημοσ.

Θέλω να αλλάζει το μπλοκ που δείχνει ο sarr. Αν έχω δηλαδή 2 πίνακες από strings sarr1 και sarr2, θέλω να μπορώ να τους κάνω π.χ. swap, δεν θέλω όμως να μπορούν να αλλάξουν ούτε τα sarr ούτε τα *(sarr) σε κανέναν από τους 2 πίνακες.

Δημοσ.

Δοκίμασε αυτό:

 

>

const char * const * const *sarr;

 

Ή με typedef

 

>
typedef const char * const * const innerPointers;
typedef innerPointers* sarr;

 

Edit

 

Υ.Γ. Έκανα μία αλλαγή... αυτό είναι το σωστό στο πρώτο code /code block.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

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