2016-03-24 1 views
0

Je suis nouveau à C. Quelqu'un peut-il m'expliquer quelle est la différence entre ceux-ci?C transmission comme un pointeur

J'utilise habituellement des pointeurs comme ceci:

int myFunction(int* something) { 
    ... 
} 

int main() { 
    int something; 
    something = 0; 

    myFunction(&something); 
    ... 
} 

Mais j'ai trouvé un code qui ressemble à ceci:

int myFunction(int& something) { 
    ... 
} 

int main() { 
    int something; 
    something = 0; 

    myFunction(something); 
    ... 
} 

Il semble que exactement le même chose pour moi. Y a-t-il une différence?

+0

q plus tôt marquée est en C++, ce qui est étiqueté C. Je crois toujours, ils sont des langues différentes. –

+1

@SouravGhosh Je suis assez sûr que vous avez raison :) –

Répondre

3

Comme vous l'avez mentionné, int myFunction(int& something) { est pas C. valide Il est une référence, qui est utilisé dans C++.

C et C++ sont différentes langues, malgré la similitude dans la syntaxe.

Dans le cas, vous voulez modifier le contenu de something, vous devez lui passer un pointeur sur la fonction appelée et opérer sur le pointeur. Le pointeur lui-même sera passé par valeur, mais en déferrant le pointeur à l'intérieur de la fonction appelée, vous pouvez obtenir le résultat du passage par référence.

Votre premier extrait est donc valide. Vous devriez l'utiliser en C.

+0

Je vois, c'est le problème! Donc je ne peux pas utiliser ça en C? Je vous remercie. –

1
  • Le premier est un pointeur, qui est valide C.
  • Ce dernier est un C++ référence, qui n'est pas valide C.

La différence la plus notable est "sucre syntaxique". Pour accéder au contenu du pointeur something, vous devez taper *something. Lorsque vous faites la même chose avec la référence C++ something, vous n'avez pas besoin du *.

Une différence plus subtile est qu'un pointeur peut être utilisé pour l'arithmétique du pointeur. Par exemple, pour mettre en œuvre la fonction de bibliothèque strlen, vous pourriez faire quelque chose comme ceci:

size_t strlen (const char* s) 
{ 
    const char* start = s; 

    while(*s != '\0') 
    { 
    s++; 
    } 

    return (size_t)(s - start); 
} 

Ce ne serait pas possible si s était une référence. Il faudrait utiliser des compteurs séparés, etc.

Notez que une référence C++ est 100% fonctionnellement équivalent à un pointeur en lecture seule:

int* const something // C equivalent of a reference