2017-03-25 8 views
1

2次元配列が関数パラメータである場合の2つの言葉の違いは何ですか?2次元配列が関数パラメータである場合の2つの言葉の違いは何ですか?

#include <bits/stdc++.h> 
#include <windows.h> 
using namespace std; 

void dfs(int (*a)[10]){ 
    for(int i=0;i<5;i++){ 
     for(int j=0;j<10;j++){ 
      cout<<a[i][j]<<" "; 
     } 
    } 
} 
void dfs2(int a[][10]){ 
    for(int i=0;i<5;i++){ 
     for(int j=0;j<10;j++){ 
      cout<<a[i][j]<<" "; 
     } 
    } 
} 
int main(){ 

    int (*a)[10]=new int[5][10]; 
    for(int i=0;i<5;i++){ 
     for(int j=0;j<10;j++){ 
      a[i][j]=i*j; 
     } 
    } 
    dfs(a); 
    dfs2(a); 
    delete []a; 
    return 0; 
} 

dfs(int (*a)[10])dfs2(int a[][10])すべてが動作することができ、私は時に配列が非常に大きいかを知りたい、それが効率的でしょうか?

答えて

1

2次元配列が関数パラメータである場合の2つの言葉の違いは何ですか?

ありません。

したがって、両方の関数に同じ名前を付けると、再定義エラーが発生します。

しかし、dfs(int (*a)[10])バージョンは、配列が値渡しできないことを示しているため、大きな値を示します。そうしようとすると、ポインタが代わりに渡され、サイズ情報が失われます。あなたはint[10]オブジェクトへのポインタで終わります。int[10]の配列全体の始まりであってもなくてもかまいません。

私は配列が非常に大きいときに知りたい、それは効率的でしょうか?

違いが全くないので、配列の大きさも関係ありません。効率性も完全に無関係なトピックです。いずれの場合においても


、すべての配列のものを削除しstd::vectorを使用します。非標準の<bits/stdc++.h>ヘッダーを使用しないでください.Windows APIが不要な場合は<windows.h>を使用しないでください。最後に、using namespace std;を避けてください。

+0

ありがとうございました。言い換えれば、私のコードはメモリリークを引き起こす可能性があります..... – guanjun

+0

多次元の行列を連続させることに利点があります。しかし、 'std :: array'の' std :: array'は、すべての頭痛のない生の配列と同様にそれを行います。 – aschepler

+0

@guanjun:メモリリークの原因について何も言わなかった。しかし、生の動的に割り当てられた配列が簡単にメモリリークを引き起こす可能性があると言ったときは正しいでしょう。これは、あなたがそれらを避けたい理由の一つです。 –

関連する問題