2016-12-03 3 views
3

Es scheint ein ein Array durch Bezugnahme auf das erste Element hindurchgehen kann:Eine pathologische Art und Weise eine Anordnung von übergeben wird: durch Bezugnahme auf das erste Elemente

void passMe(int& firstElement) 
{ 
    int* p=&firstElement; 
    cout << p[0] << p[1]; 
} 

Hauptprogramm:

int hat[]={ 5,2,8 }; 
passMe(hat[0]); 

Normalerweise anstelle der obigen Funktionsdefinition würde ich void passMe(int* myArray) oder void passMe(int[] myArray) tun. Aber würde die obige Methode irgendwelche Probleme verursachen? Wenn ich die Antwort kenne, kann ich die Dinge, die hier spielen, besser verstehen.

+2

Bitte beachten Sie, dass C und C++ verschiedene Sprachen sind. Dies ist eindeutig eine C++ - Frage, verwenden Sie bitte nur das entsprechende Tag. – kaylum

+0

Das eine Problem ist, dass Sie nicht wissen, wie viele Elemente das Array innerhalb der 'passMe'-Funktion bilden. – PaulMcKenzie

+0

@ kaylum Danke für die Erinnerung. Ja, "cout" ist nur in C++ zulässig, aber ich habe C markiert, weil der Hauptpunkt der Frage meiner Meinung nach für beide gleichermaßen gilt. – FreshAir

Antwort

8

Soweit die Sprache-Anwälte und der Compiler betroffen sind, ist es in Ordnung. Das Hauptproblem wird mit den menschlichen Programmierern sein (einschließlich zukünftiger Versionen von dir selbst). Wenn Ihre Standard-C++ Programmierer dies in einem Programm sehen:

void passMe(int& firstElement); // function declaration (in a .h file) 

int hat[]={ 5,2,8 }; 
passMe(hat[0]); 

Er wird erwarten, dass PassMe() lesen könnte und/oder modifizieren Hut [0]. Er ist definitiv nicht gehen zu erwarten, dass passMe() könnte lesen und/oder ändern Hut [1]. Und wenn er schließlich herausfindet, was du tust, wird er sehr wütend auf dich sein, weil er ihn durch unnötig "cleveren" Code irregeführt hat. :) Wenn ein anderer Programmierer (der seinen Trick nicht kennt) versucht, seine Funktion von seinem eigenen Code aus aufzurufen, nachdem er nur die Funktionsdeklaration in der Kopfzeile gesehen hat, wird er wahrscheinlich versuchen, so etwas zu tun :

int cane = 5; 
passMe(cane); 

..., die direkt auf mysteriöse undefinierten Verhalten zur Laufzeit führen wird, wenn PassMe() versucht, das zweite Element im Array nach cane, deren Ausnutzung existiert nicht wirklich, weil Zuckerrohr in ein nicht wirklich ist Array.

+0

Die gleiche Logik kann angewendet werden, um den * Zeiger * an das erste Element im Array zu übergeben. Der einzige Unterschied besteht darin, dass wir aus einer Vielzahl von meist historischen Gründen eher erwarten können, verglichen mit einer Referenz. – SomeWittyUsername

+0

Die einzige Instanz, in der Sie leicht die Adresse der übergebenen Referenz sehen würden, ist der Test für die Selbstzuweisung in vielen Implementierungen von 'operator =', d. H. 'If (this!= & rhs) ' – PaulMcKenzie

+0

@PaulMcKenzie Das ist wahr - ich denke, der fragliche Teil des Beispiels des Fragestellers ist nicht die Ableitung eines Zeigers aus der Referenz, sondern die Anwendung von Zeigerarithmetik auf diesen Zeiger danach (dh die Annahme, dass der übergebene Wert wird Teil eines Arrays sein, obwohl die Signatur der Funktion eine ist, die viele/die meisten Programmierer davon ausschließen würden. –

Verwandte Themen