Wenn eine Funktion hat eine bestimmte Größe-array-parameter, warum wird es ersetzt mit einem Zeiger?
Gegeben, das folgende Programm,
#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 ist das array übergeben als pointer auf das erste element?
- Ist es ein Erbe aus C?
- Was bedeutet der standard sagen?
- Warum ist die strikte Typsicherheit von C++ gelöscht?
Ich benutze immer-std::array in diesen Fällen verhindert haben, um sich mit Fragen wie diese und arbeitet mit std-algorithmen zu
Was strenge Typsicherheit? Wer hat versprochen strenge Typsicherheit? Es gibt keine solche Sache in C++.
TL;DR für die unten Antworten: Arrays werden Zeiger als Parameter an die Funktion übergeben, so dass, wenn Sie überprüfen Sie Ihre Größe alles, was Sie bekommen, ist die Größe eines Zeigers. Wenn Sie arbeiten, nur C, alle, die ich vorschlagen kann, ist, dass Sie im Voraus berechnen, welche Größe Sie auch immer versuchen, um aus dem array als weiteren parameter.
Relevanten Linus rant
Was strenge Typsicherheit? Wer hat versprochen strenge Typsicherheit? Es gibt keine solche Sache in C++.
TL;DR für die unten Antworten: Arrays werden Zeiger als Parameter an die Funktion übergeben, so dass, wenn Sie überprüfen Sie Ihre Größe alles, was Sie bekommen, ist die Größe eines Zeigers. Wenn Sie arbeiten, nur C, alle, die ich vorschlagen kann, ist, dass Sie im Voraus berechnen, welche Größe Sie auch immer versuchen, um aus dem array als weiteren parameter.
Relevanten Linus rant
InformationsquelleAutor CsTamas | 2009-08-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist vererbt von C. Die Funktion:
Müssen die parameter angepasst werden, um einen Zeiger, so wird:
Wenn Sie wollen, dass die array-Typ erhalten, sollten Sie übergeben eine Referenz auf das array:
C++ '03 8.3.5/3:
Zu erklären, die syntax:
Häkchen für "rechts-Links" - Regel in google, fand ich eine Beschreibung hier.
Es angewendet werden würde, in diesem Beispiel etwa wie folgt:
Start Bezeichner 'a'
Rechts zu bewegen - wir finden eine
)
so dass wir in umgekehrter Richtung suchen für die(
. Wie bewegen wir uns Links, passieren wir&
Nach der
&
erreichen wir die Eröffnung(
so dass wir wieder umkehren und nach rechts schauen. Wir sehen jetzt[100]
Und wir umgekehrter Richtung wieder bis wir
char
:es ist wohl erwähnenswert, dass die Verwendung eines std::vector wird ordentlich Seite Schritt alle Probleme im Zusammenhang mit der übergabe von arrays.
Dies läuft darauf hinaus, die Tatsache, dass plain array-Parameter in C/C++ sind eine Fiktion - Sie sind wirklich Zeigern. Array-Parameter sollten so weit wie möglich vermieden - werden Sie wirklich nur verwirren Angelegenheiten.
Nur eine nit-pick: der parameter der Funktion nicht zerfallen zu Zeiger. Es ist angepasst Zeiger. Ein array-name als eine Funktion argument kann
Bravo für die Erklärung der Regel, da der link wird jetzt ein 404.
InformationsquelleAutor Richard Corden
Ja. In C und C++ können Sie nicht übergeben von arrays an Funktionen. Das ist einfach so wie es ist.
Warum machst du plain arrays sowieso? Haben Sie sah
boost
/std::tr1::array
/std::array
oderstd::vector
?Beachten Sie, dass Sie können, jedoch, übergeben Sie eine Referenz auf ein array von beliebiger Länge auf eine Funktion Vorlage. Aus der Spitze von meinem Kopf:
Übergabe by reference to array ist nicht beschränkt auf die Funktion "Vorlagen". Übergeben Sie ein array als Referenz zu nicht-template-Funktionen. Der Vorteil der Verwendung der Funktion Vorlage, können Sie ableiten, die den array-index, damit, dass Sie rufen Sie die Funktion für Verschieden große array-Typen.
ja, die Regeln für die übergabe von arrays und Objekten in C Strukturen sind tatsächlich kopiert von Wert, wenn Sie als parameter übergeben werden. Arrays behandelt werden als Zeiger auf Ihr erstes element. (Arrays und Pointer in C sind sehr miteinander verwandt sind. Sie sind nicht die gleiche Sache, aber für die Zwecke für die parameter übergeben, die Sie identisch sind)
Oder einfach nur
std::cout << N;
🙂Es gibt std::array jetzt.
InformationsquelleAutor sbi
Gibt es herrliche Wort in C/C++ - Terminologie, die verwendet wird, für statische arrays und Funktion - Zeiger - Zerfall.
Betrachten Sie den folgenden code:
extern
Verknüpfung, nichtstatic
. Und ich bin mir nicht sicher, welche Funktion Zeiger haben damit irgendwas zu tun hier?InformationsquelleAutor DaddyM