2016-03-24 18 views
0

Ich bin neu bei C. Kann mir jemand erklären, was ist der Unterschied zwischen diesen?C Übertragung als Zeiger

Normalerweise verwende ich Zeiger wie folgt aus:

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

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

    myFunction(&something); 
    ... 
} 

Aber ich habe Code gefunden, die wie folgt aussieht:

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

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

    myFunction(something); 
    ... 
} 

Es scheint, wie genau die gleiche Sache für mich. Gibt es einen Unterschied?

+0

Je früher markiert q ist in C++ und dies markiert C. Ich glaube immer noch, sie sind verschiedene Sprachen. –

+1

@SouravGhosh Ich bin mir ziemlich sicher, dass du Recht hast :) –

Antwort

3

Wie Sie erwähnt haben, int myFunction(int& something) { ist nicht gültig C. Es ist eine Referenz, die in C++ verwendet wird.

C und C++ sind verschiedene Sprachen, trotz der Ähnlichkeit in der Syntax.

Falls Sie den Inhalt von something ändern möchten, müssen Sie einen Zeiger auf die aufgerufene Funktion übergeben und mit dem Zeiger arbeiten. Der Zeiger selbst wird als Wert übergeben, aber durch Aufheben des Referenzierens des Zeigers innerhalb der aufgerufenen Funktion können Sie das Ergebnis des Referenzierens erreichen.

So ist Ihr erstes Snippet gültig. Sie sollten in C.

+0

Ich sehe, das ist das Problem! Also kann ich das nicht in C benutzen? Vielen Dank. –

1
  • Erstere ist ein Zeiger, der gültig ist, C.
  • Letzteres ist ein C++ Referenz, die C.

Der bemerkenswerteste Unterschied ist nicht gültig verwenden, die ist "syntaktischer Zucker". Um auf den Inhalt des Zeigers something zuzugreifen, müssen Sie *something eingeben. Wenn Sie dasselbe mit der C++ - Referenz something tun, benötigen Sie nicht die *.

Ein feinerer Unterschied ist, dass ein Zeiger für die Zeigerarithmetik verwendet werden kann. Um zum Beispiel der Bibliotheksfunktion strlen zu implementieren, könnte man so etwas tun:

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

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

    return (size_t)(s - start); 
} 

Dies wäre nicht möglich, wenn s eine Referenz ist. Sie müßten separate Zähler verwenden usw.

Beachten Sie, dass eine C++ Referenz 100% funktional äquivalent zu einem Nur-Lese-Zeiger ist:

int* const something // C equivalent of a reference