C ++ - Arrays als Funktionsargumente

8
  • Kann ich Arrays an Funktionen übergeben, so wie ich es auch mit Primitiven wie int und bool tun würde?
  • Kann ich sie nach Wert übergeben?
  • Wie weiß die Funktion über die Größe des Arrays, das übergeben wird?
Dr. Acula 19.05.2010, 17:10
quelle

8 Antworten

24
  

Kann ich Arrays auch an Funktionen übergeben?   Ich würde mit Primitiven wie int tun   und bool?

Ja, aber nur mit Hilfe von Zeigern (dh durch Referenz).

  

Kann ich sie nach Wert übergeben?

Nein. Sie können Klassen erstellen, die dies unterstützen, aber einfache Arrays nicht.

  

Wie weiß die Funktion über die Größe des Arrays, das übergeben wird?

Es tut es nicht. Das ist ein Grund, Dinge wie vector<T> anstelle von T * zu verwenden.

Erläuterung

Eine Funktion kann eine Referenz oder einen Zeiger auf ein Array einer bestimmten Größe nehmen:

%Vor%

Ich bin mir aber ziemlich sicher, dass das nicht das ist, wonach der OP gesucht hat.

    
egrunin 19.05.2010 17:15
quelle
14

Sie können Arrays wie üblich in C übergeben (Arrays werden zu Zeigern), oder Sie können sie als Referenz übergeben, aber sie können nicht als Wert übergeben werden. Für die zweite Methode tragen sie ihre Größe mit sich:

%Vor%

Meistens ist die Verwendung von std::vector oder einer anderen Sequenz in der Standardbibliothek eleganter, es sei denn, Sie benötigen native Arrays speziell.

    
AraK 19.05.2010 17:15
quelle
4
  

Kann ich Arrays auch an Funktionen übergeben?   Ich würde mit Primitiven wie int tun   und bool?

Ja, das kannst du. Übergeben einen Array-Namen als Argument für eine Funktion übergibt die Adresse des ersten Elements.

Kurz gesagt:

%Vor%

entspricht

%Vor%
  

Kann ich sie nach Wert übergeben?

Nicht wirklich. Der "Wert", der mit einem Array-Namen übergeben wird, ist die Adresse des ersten Elements.

Die einzige Möglichkeit, eine Kopie eines C-artigen Arrays zu übergeben, besteht darin, sie in ein class oder struct umzubrechen, das die Deep-Copy-Semantik implementiert.

  

Wie kennt die Funktion die Größe?   des Arrays ist es übergeben?

Es ist nicht, wenn Sie Ihre Funktion haben, nehmen Sie einen zusätzlichen Parameter, der die Größe des Arrays ist.

    
JohnMcG 19.05.2010 17:26
quelle
3

Sie können ein Array übergeben, aber Sie müssen die Größe mit übergeben, wenn Sie es sicher wissen wollen:

%Vor%

Arrays werden immer als Referenz übergeben und die Funktion kann auf zwei Arten geschrieben werden:

%Vor%

oder

%Vor%

Wenn Sie ein Array an eine Funktion übergeben, erhält die Funktion im Wesentlichen einen Zeiger auf dieses Array, wie im zweiten Beispiel oben gezeigt. Beide Beispiele werden dasselbe erreichen.

    
Mike Webb 19.05.2010 17:21
quelle
2

Sie können ein std::vector und ähnlich gut entworfenes Objekt nach Wert übergeben (obwohl das eher ungewöhnlich ist). In der Regel übergeben Sie die Referenz oder const Referenz.

Ein C / C ++ - Array, wie in

%Vor%

wird immer als Referenz übergeben. Außerdem kann die Funktion die wahre Größe des vom Aufrufer übergebenen Arguments nicht bestimmen, Sie müssen eine Größe annehmen (oder sie als separaten Parameter übergeben).

    
peterchen 19.05.2010 17:14
quelle
2

C-artige Arrays verhalten sich sehr seltsam, wenn sie in Funktionen übergeben werden. Für Arrays mit fester Größe würde ich stattdessen std::array<int, 10> empfehlen, die wie integrierte Typen von Wert übergeben werden können. Für Arrays mit variabler Größe empfehle ich std::vector<int> , wie in anderen Antworten vorgeschlagen.

    
fredoverflow 19.05.2010 17:46
quelle
1
  1. Ja. Zum Beispiel: void f(int a[]); und nennen Sie es so: int myArr[size]; f(myArr);
  2. Nein, Arrays werden automatisch als Referenz übergeben. Sie müssen Ihr Array in eine Struktur oder Klasse einbinden, wenn Sie die Übergabe nach Wert simulieren möchten.
  3. Tut es nicht. Sie müssen die Größe selbst überschreiten.
IVlad 19.05.2010 17:15
quelle
1

Ja, Sie können sie genauso übergeben wie primitive Typen. Ja, Sie können nach Wert übergeben, wenn Sie wirklich mit etwas Wrapper-Code wollten, aber Sie sollten es wahrscheinlich nicht. Es wird die Größe des Funktionsprototyps als die Länge annehmen - die mit den eingehenden Daten übereinstimmt oder nicht -, also weiß es nicht wirklich.

Oder!

Übergeben Sie einen Referenz- oder Const-Verweis an einen Vektor und seien Sie sicherer und halten Sie die Größenangaben an Ihren Fingerspitzen fest.

    
Michael Dorgan 19.05.2010 17:16
quelle

Tags und Links