2014-10-23 8 views
5

Dies ist eine Übung von C++ Primer 5. Auflage, das geht:Verwirren über Array-Parameter

Übung 6.24: Erklären Sie das Verhalten der folgenden Funktion. Wenn es im Code Probleme gibt, erkläre, was sie sind und wie du sie beheben kannst.

void print(const int ia[10]) 
{ 
    for (size_t i = 0; i != 10; ++i) 
     cout << ia[i] << endl; 
} 

ich in den Codes kein Problem finden können. Was ist der Sinn dieser Übung?

+1

Es ist keine sehr nützliche Funktion. Es kann nur ein Array von genau 10 Elementen drucken. Wenn Sie ein Array mit weniger als 10 Elementen bereitstellen, wird es unterbrochen. –

+0

@NeilKirk: Was ist, wenn Sie ein Array mit mehr als 10 Elementen bereitstellen? –

+0

Ich kenne die magischen Zahlen schon. noch etwas? – pezy

Antwort

8

Das allgemeine Problem ist, dass in C++ Deklarationssyntax, Array-Typen in Funktionsparameter Deklarationen etwas nicht-intuitive bedeuten: ein Parameter als T[] deklariert oder als T[10] oder als T[1279] tatsächlich deklariert als T* – alle diese Parameter Erklärungen identisch sind. *

Denken Sie daran, dass in C++ keine Prvalues ​​des Array-Typs vorhanden sind und Array-Typen daher keine Funktionsparameter oder Rückgabetypen sein können. (Bei Verwendung als prvalue verwendet, ein Array abklingt auf einen Zeiger auf das erste Element.)

Daher Funktionsdeklaration tatsächlich ist (mit T = const int):

void print(const int *); 

Dieser Parametertyp spielt gut mit das Verkleinern von Array zu Pointer, aber jetzt ist klar, dass Sie beliebige Zeiger auf int zu dieser Funktion übergeben können, und die Richtigkeit der Funktionsausführung kann nicht aus der Funktionsdefinition allein bestimmt werden.

*) Es ist ein wenig more complicated in C99.


Auf einer Seite beachten, Array glvalues ​​ sind völlig in Ordnung, wie die folgende Funktion ist, die einen Parameter aufweist, deren Typ "Bezug auf Array":

void print10(const int (&a)[10]) 
{ 
    for (auto i : a) { std::cout << i << "\n"; } 
} 
+0

@pezy Ich habe das gleiche Buch wie du, also weiß ich, dass glvalues ​​noch nicht besprochen wurde. [Diese Antwort] (http://stackoverflow.com/a/3601661/729541) gibt Ihnen eine Vorstellung davon, was sie sind, wenn Sie sie vorher woanders nicht getroffen haben. –

+0

Das ist eine Funktion, die schon vor langer Zeit veraltet sein sollte. –

+1

"Keine Rvalues ​​des Array-Typs in C++, und daher können Array-Typen keine Funktionsparameter oder Rückgabetypen sein." Danke für Ihre Erinnerung !! – pezy

Verwandte Themen