2013-02-18 10 views
5

私はパラメータとして配列を渡すときに、これらのうちどれが最適かと思いましたか?パラメータとしての配列

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

または

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

あなたは私にあなたの理由を教えてもらえますか?どの本を参照するのか?ありがとう!

+0

機能するように配列を渡すと、それは配列の最初の要素へのポインタとして減衰します。だからどちらも同じです。 –

+0

これらのうちどれですか? 'void function(std :: string const&str){...};'が最適です。 – Johnsyweb

+0

推奨読書:http://stackoverflow.com/a/4810672/78845 – Johnsyweb

答えて

4

を、私はどちらを使用します。 にする必要がある場合は、どちらも同じです。

しかし、あなたがC++を使用するので、より良いアプローチは、このようなタスク

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

か、あなたは配列/ベクトルに

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

これらは意味的に同一です。

#1は、あなたが配列を渡していることを明示しているので、(私の意見では)#1はやや良いです。

+3

彼らは_構文的に異なっています。彼らはまったく同等です。 –

+0

そして私は#2を好むが、あなたが配列を渡していることを明示しているからではないことを告白しなければならない。私はそれがあなたが**アドレス** = Pを渡していることを明示的にするので、それを好む – WhozCraig

0

パラメータとして配列を渡すための最良の方法は、実際にある:(渡した文字列のような)いくつかの例については

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

あなたは、多くの場合、これらの2つのパラメータを省略することができます。しかし、それらはいずれかの方法で役に立つかもしれません。たとえば、文字列に対して何らかの操作を行う場合や、strlen呼び出しまたは2つを保存する場合があります。

関数の引数に[]オプションを使用するのは私の意見では紛らわしく、避けるべきです。しかし、私はそれが大会だとは思わない。

3

(動的に割り当てられたものを含む)任意の配列を渡すだけの場合、それらは同等です。

あなたの関数は、実際の固定サイズの配列が必要な場合は、あなたがこれを行うことができます:この質問はタグ付けされているので

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

を変更しない場合は、尋ねるためstd::vectorを使用することです

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

で選択します
void function(int* arr) {...}; 

後者では、ポインタ自体をconstと宣言できますが、前者では項目をconstと宣言することしかできません。しかし、読者には[]は、おそらく単一のオブジェクトへのポインタではなく、配列を示します。個人的には、constによって提供される制約は、[]によって提供されるarray'nessの表示よりも実質的に有用だと思います。

レベルコードが高い場合は、std::vectorまたはstd::arrayのどちらか適切な方を使用してください。、

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; 
    } 
} 

その方法は、あなたが配列のためだけでなく、機能を使用することができます。

0

は、あなたが提供したい抽象化の層によっては、オラフのアプローチか何かのSTL偉大なレベルに使用しています間を選んだはずですベクトル、リスト、キュー、スタックなど、さまざまなSTLタイプに対応します。

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

std::vector<int> vec; 
// fill vector with something 
function(vec.begin(), vec.end()); 
関連する問題