2010-07-13 31 views
2

Voici le contexte du code:Que signifie l'expression "BIO * client = (BIO *) arg"?

void THREAD_CC server_thread(void *arg) 
{ 
    BIO *client = (BIO *)arg; 
     ... 
} 

Est-ce que l'expression (BIO *)arg transformer le pointeur de vide arg dans un pointeur qui pointe vers BIO? Je ne suis pas sûr si j'ai bien compris ou non.

Toute aide serait grandement appréciée!

Z.Zen

Répondre

6

Cela s'appelle une distribution; il ne transforme pas le pointeur, il persuade le compilateur de prendre votre mot que le pointeur entrant (qui n'est pas typé) est en fait un pointeur sur BIO, et de le traiter comme tel.

+1

Oui. C'est la seule bonne réponse possible. Un tel casting ne "transforme" rien, il demande juste au compilateur de se taire. – sharptooth

+0

Non, cela * transforme * le pointeur. Si un pointeur «void *» et un pointeur «BIO *» ont des représentations différentes, cela changera le premier en dernier. Cela équivaut à lancer 'int' à' long' - bien sûr, sur * certains * systèmes cela peut être un non-op, mais pas en général. – caf

+0

@caf ?? Que voulez-vous dire? que la "nature" d'un pointeur peut changer selon la pointee? – ShinTakezou

1

Oui. (BIO *)jette le pointeur void * (arg) être de type BIO *

1

Il transforme (jette) le vide * en un pointeur de type BIO *. Il ne "pointe" pas vers BIO.

0

Votre variable d'entrée arg est de type void. Typecasting jette simplement la variable d'un type à l'autre. Ceci est utile lorsque vous transmettez des pointeurs en tant qu'arguments à différentes fonctions et que vous les convertissez en leur type d'origine lors de leur déréférencement.

Dans le cas ci-dessus, tapez arg du type (void *) au type (BIO *). Vous pouvez maintenant accéder aux membres du ponter client comme vous le feriez pour un type de pointeur BIO * normal.