Angesichts des folgenden Programms,
#include <iostream>
using namespace std;
void foo( char a[100] )
{
cout << "foo() " << sizeof( a ) << endl;
}
int main()
{
char bar[100] = { 0 };
cout << "main() " << sizeof( bar ) << endl;
foo( bar );
return 0;
}
Ausgänge
main() 100
foo() 4
- Warum wird das Array als Zeiger auf das erste Element übergeben?
- Ist es ein Erbe von C?
- Was sagt der Standard?
- Warum wird die strikte Typensicherheit von C ++ aufgehoben?
Antworten:
Ja, es ist von C geerbt. Die Funktion:
void foo ( char a[100] );
Wird der Parameter als Zeiger angepasst und wird so:
void foo ( char * a );
Wenn Sie möchten, dass der Array-Typ erhalten bleibt, sollten Sie einen Verweis auf das Array übergeben:
void foo ( char (&a)[100] );
C ++ '03 8.3.5 / 3:
So erklären Sie die Syntax:
Suchen Sie in Google nach der Regel "rechts-links". Ich habe hier eine Beschreibung gefunden .
Es würde ungefähr wie folgt auf dieses Beispiel angewendet:
void foo (char (&a)[100]);
Beginnen Sie mit der Kennung 'a'
Bewegen Sie sich nach rechts - wir finden eine,
)
also kehren wir die Richtung um und suchen nach dem(
. Wenn wir uns nach links bewegen, gehen wir vorbei&
Nach dem
&
erreichen wir die Öffnung,(
also kehren wir wieder um und schauen nach rechts. Wir sehen jetzt[100]
Und wir kehren die Richtung wieder um, bis wir erreichen
char
:quelle
Ja. In C und C ++ können Sie keine Arrays an Funktionen übergeben. So ist es halt.
Warum machst du überhaupt einfache Arrays? Hast du dir
boost
/std::tr1::array
/std::array
oder angesehenstd::vector
?Beachten Sie, dass Sie kann jedoch eine Referenz auf ein Array von beliebiger Länge an eine Funktion Vorlage . Aus dem Kopf:
template< std::size_t N > void f(char (&arr)[N]) { std::cout << sizeof(arr) << '\n'; }
quelle
:)
In der C / C ++ - Terminologie gibt es ein großartiges Wort, das für statische Arrays und Funktionszeiger verwendet wird - Zerfall . Betrachten Sie den folgenden Code:
int intArray[] = {1, 3, 5, 7, 11}; // static array of 5 ints //... void f(int a[]) { // ... } // ... f(intArray); // only pointer to the first array element is passed int length = sizeof intArray/sizeof(int); // calculate intArray elements quantity (equals 5) int ptrToIntSize = sizeof(*intArray); // calculate int * size on your system
quelle
extern
nicht verknüpftstatic
. Und ich bin mir nicht sicher, was Funktionszeiger hier mit irgendetwas zu tun haben?