2013-02-18 17 views
5

Ich frage mich, welcher von diesen der beste ist, wenn ich ein Array als Parameter übergebe?Array als Parameter

void function(int arr[]) {...}; 

oder

void function(int* arr) {...}; 

Können Sie mir den Grund sagen? und auf welches Buch kannst du dich beziehen? Vielen Dank!

+0

Wenn Sie ein Array zur Funktion übergeben, verfällt es als Zeiger auf das erste Element des Arrays. Also sind beide identisch. –

+0

Aus diesen? 'void function (std :: string const & str) {...};' ist das Beste. – Johnsyweb

+0

Empfohlener Messwert: http://stackoverflow.com/a/4810672/78845 – Johnsyweb

Antwort

4

Da diese Frage markiert ist, würde ich nicht verwenden. Wenn Sie verwenden müssen, sind beide gleichwertig.

Aber da Sie C++ verwenden, ein besserer Ansatz ist es, eine std::vector für solche Aufgaben

void function(std::vector<int> &arr) {...} 

oder zu verwenden, wenn Sie das Array/Vektor

void function(const std::vector<int> &arr) {...} 
1

Sie sind semantisch identisch.

# 1 ist etwas besser (meiner Meinung nach), weil es explizit macht, dass Sie ein Array übergeben. tatsächlich

+3

Sie sind _syntaktisch_ verschieden. Sie sind _semantisch_ äquivalent. –

+0

Und ich muss gestehen, ich bevorzuge # 2, aber nicht, weil es explizit macht, dass Sie ein Array übergeben; Ich bevorzuge es, weil es explizit macht, dass du eine ** Adresse ** = P passierst – WhozCraig

0

Der beste Weg ist, ein Array als Parameter zu übergeben:

void function(type_t* array, int amountOfElts, int arrayAllocatedElts);

Für manchen Fällen (wie bei Strings vorbei) Sie oft diese beiden Parameter überspringen. Aber sie können in beiden Fällen nützlich sein, zum Beispiel, wenn Sie einige Operationen an der Zeichenkette ausführen, oder sie können Ihnen einen oder zwei Streichen ersparen.

Die Verwendung der [] -Option in Funktionsargumenten ist meiner Meinung nach verwirrend und sollte vermieden werden. Aber ich denke nicht, dass es eine Konvention ist.

3

Wenn Sie nur ein Array (einschließlich dynamisch zugewiesen) übergeben möchten, sind sie gleichwertig.

Sollte Ihre Funktion eine tatsächliche feste Größe Array benötigen, können Sie dies tun:

template <size_t N> 
void function(char (&str)[N]) { ... } 
1

Sie fragen nicht ändern die zur Auswahl von

void function(int arr[]) {...}; 

und

Letzteres ermöglicht es Ihnen, den Zeiger selbst als const zu deklarieren, während der erstere nur erlaubt, die Elemente als const zu deklarieren. Für den Leser gibt [] jedoch ein Array im Gegensatz zu möglicherweise einem Zeiger auf ein einzelnes Objekt an. Persönlich denke ich, dass die Beschränkung, die von const angeboten wird, praktischer ist als die Angabe der Array-Eigenschaft, die von [] angeboten wird.

Für höheren Code verwenden Sie std::vector oder , je nachdem, was geeigneter ist.

0

Abhängig von der Ebene der Abstraktion Sie zur Verfügung stellen möchten, sollten Sie zwischen Olaf Ansatz oder etwas STL verwendet, um die große Ebene:

template <class Iter> 
void function(Iter first, Iter last) 
{ 
    // for example, to get size: 
    std::size_t size = std::distance(first, last); 
    // for example, to iterate: 
    for (Iter it = first; it != last; ++it) 
    { 
     // *it to get the value, like: 
     std::cout << *it << std::endl; 
    } 
} 

Auf diese Weise Sie die Funktion nicht nur für Arrays verwenden können, aber für verschiedene STL-Typen: Vektoren, Listen, Warteschlangen, Stapel und so.

int tab[4] = {1,2,3,4}; 
function(tab, tab+4); 

std::vector<int> vec; 
// fill vector with something 
function(vec.begin(), vec.end()); 
Verwandte Themen