C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Pointeur de pointeur const

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Guillaume GOURDIN
Guest





PostPosted: Wed Nov 29, 2006 5:09 pm    Post subject: Pointeur de pointeur const Reply with quote



Bonjour à tous,

je ne comprends pas pourquoi le code suivant ne compile pas :

void foo(const int ** param);

int ** p;
foo(p); // Ne compile pas...

g++ me dit que ne pas convert un 'int**' vers un 'const int**'.

D'ailleurs, si je déclare un 'const int ** p', qu'est-ce qui est const?
Les pointeurs eux même (par ex. je n'ai pas le droit de faire
'p[0]=NULL')? Ou alors les données sous les pointeurs de pointeurs (par
ex. je n'ai pas le droit de faire 'p[0][0]=10')?

Et est-il possible de déclarer un pointeur const de pointeur const? De
telle sorte d'interdire 'p[0]=NULL' et 'p[0][0]=10'.

Merci pour vos éclaircissements.
Back to top
Michel Decima
Guest





PostPosted: Wed Nov 29, 2006 7:12 pm    Post subject: Re: Pointeur de pointeur const Reply with quote



Guillaume GOURDIN a écrit :
Quote:
Bonjour à tous,

je ne comprends pas pourquoi le code suivant ne compile pas :

void foo(const int ** param);

int ** p;
foo(p); // Ne compile pas...

g++ me dit que ne pas convert un 'int**' vers un 'const int**'.

je ne sais pas, j'aurais pensé aussi que ca devait compiler, mais
je n'utilise presque jamais des pointeurs de pointeurs, il y a peut etre
une subtilité qu im'echappe.

Quote:
D'ailleurs, si je déclare un 'const int ** p', qu'est-ce qui est const?
Les pointeurs eux même (par ex. je n'ai pas le droit de faire
'p[0]=NULL')? Ou alors les données sous les pointeurs de pointeurs (par
ex. je n'ai pas le droit de faire 'p[0][0]=10')?

Tu declares un pointeur vers des pointeurs vers des donnees constantes.
(2eme cas). Pour s'en sortir, il y aune astuce qui consiste a placer le
const apres le type auquel il se rapporte, et lire la declaration de
droite a gauche:

int const ** p;

(une autre solution: ne pas utiliser de pointeurs de pointeurs, mais ce
n'est pas le sujet).

Quote:

Et est-il possible de déclarer un pointeur const de pointeur const? De
telle sorte d'interdire 'p[0]=NULL' et 'p[0][0]=10'.

int const* const* p;

correspond au interdictions, mais c'est un pointeur (non const) vers des
pointeurs const vers des donnees const. Si tu veux que le pointeur p lui
meme soit const, alors c'est :

int const* const* const p;
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Wed Nov 29, 2006 7:44 pm    Post subject: Re: Pointeur de pointeur const Reply with quote



Guillaume GOURDIN <gourdin-paluche (AT) liw (DOT) fr> writes:

Quote:
Bonjour à tous,

je ne comprends pas pourquoi le code suivant ne compile pas :

void foo(const int ** param);

int ** p;
foo(p); // Ne compile pas...

g++ me dit que ne pas convert un 'int**' vers un 'const int**'.

Normal. Ca permettrait ce genre de chose:

int const i = 42;
int* pi;
int const** pci = &pi;
*pci = &i;
*pi = 36; /* on modifie i! */

Quote:
D'ailleurs, si je déclare un 'const int ** p', qu'est-ce qui est const?

const int** p c'est la meme chose que int const** p, c'est l'int qui est
constant.

Quote:
Et est-il possible de déclarer un pointeur const de pointeur const? De
telle sorte d'interdire 'p[0]=NULL' et 'p[0][0]=10'.

int *const *const x

A+

--
Jean-Marc
Back to top
IR
Guest





PostPosted: Wed Nov 29, 2006 8:10 pm    Post subject: Re: Pointeur de pointeur const Reply with quote

Guillaume GOURDIN wrote:
Quote:
g++ me dit que ne pas convert un 'int**' vers un 'const int**'.

S'il le faut vraiment (et ce malgré la démonstration de Jean Marc
quant à la dangerosité d'une telle conversion), const_cast fait
l'affaire:

int ** p;
foo(const_cast<const int**>(p));

Si foo fait partie intégrante de ton code, j'aurais tendance à
suggérer de revoir le design (IMHO T** c'est au moins une
indirection de trop, il y a moyen d'encapsuler tout ça un peu plus
proprement, ne serait-ce que grâce à std::vector<int*>, voire même
std::vector< std::vector<int> >).

Par contre si foo fait partie d'une lib externe, et/ou si c'est une
fonction C, eh bien, c'est pas comme s'il tu avais le choix... Wink
(quoique le std::vector<int*> est quand même utilisable même dans ces
cas là).

--
IR
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.