2010-12-06 14 views
4

Je veux juste vérifier ici comment passer une référence à une fonction qui veut un pointeur. J'ai un exemple de code ci-dessous. Dans mon cas, je passe une référence C++ à une fonction C qui va changer ma valeur.Comment transmettre une référence C++ à un argument de pointeur d'une fonction C?

Devrais-je utiliser l'adresse de l'opérateur '&' dans cet appel: retCode = MyCFunc (& myVar)? Il semble que je prenne une référence d'une référence, ce qui n'est pas autorisé en C++. Cependant, il compile bien et semble fonctionner.

MainFunc() 
{ 

    int retCode = 0; 
    unsigned long myVar = 0; 

    retCode = MyCPlusPlusFunc(myVar); 

    // use myVars new value for some checks 
    ... 
    ... 
} 

int MyCPlusPlusFunc(unsigned long& myVar) 
{ 
    int retCode = 0; 
    retCode=MyCFunc(&myVar); 
    return retCode; 
} 

int MyCFunc (unsigned long* myVar) 
{ 
    *myVar = 5; 
} 

Je pensais que mon code était au-dessus était bien, jusqu'à ce que je cet exemple sur le site IBM (ils ne passent pas à l'adresse '&' de l'opérateur): http://publib.boulder.ibm.com/infocenter/zos/v1r11/index.jsp?topic=/com.ibm.zos.r11.ceea400/ceea417020.htm

// C++ Usage 
extern "C" { 
    int cfunc(int *); 
} 

main() 
{ 
    int result, y=5; 
    int& x=y; 

    result=cfunc(x); /* by reference */ 
    if (y==6) 
    printf("It worked!\n"); 


// C Subroutine 
cfunc(int *newval) 
{ 
    // receive into pointer 
    ++(*newval); 
    return *newval; 
} 

En général, je sais que vous pouvez faire ce qui suit:

int x = 0; 
int &r = x; 
int *p2 = &r; //assign pointer to a reference 

Quel est le problème? Devrais-je utiliser l'adresse & de l'opérateur dans mon appel ou non?

+0

Veuillez corriger votre code en utilisant le bouton approprié dans le formulaire d'édition. – Muggen

+0

@Muggen - Je l'ai déjà fait –

+0

Merci ... semble beaucoup mieux maintenant! – Lair78

Répondre

3

Votre utilisation est correcte, faire &myVar pour obtenir l'adresse de celui-ci et passer à une fonction qui veut un pointeur. Prendre l'adresse d'une «référence» revient à prendre l'adresse du référent.

+0

Pourquoi Downvote? – birryree

+0

Merci. Je voulais juste une vérification de la santé après avoir vu l'exemple de code dans ce lien IBM. – Lair78

0

En fait ceci:

int x = 0; 
int &r = x; 
int *p2 = &r; 

met en p2 l'adresse de x, il est ce que vous avez besoin.

1

Le code que vous avez rencontré est erroné. Vous ne pouvez en aucun cas passer une référence à une fonction nécessitant un pointeur. Au moins, pas pour int.

+0

Oui, vous avez raison. Je voulais juste m'assurer que je ne deviendrais pas fou. Merci! – Lair78

0

Utilisez l'opérateur &. Sans lui, vous tentez une conversion invalide de int en int*.