2016-05-15 7 views
-4

多次元配列の要素を出力する関数を定義しているとします。ポインタを関数の引数として渡す正しい方法は何ですか?

int print(int *a) 
{ 
for (int i=0;i<4;i++) 
{ 
for(int j=0;j<4;j++) 
{ 
cout<< *((a+i*4)+j);} 
} 
} 
return 0;} 

私が使用して、メインでこの関数を呼び出すときに -

int c=print(int *a) or print(a) 

を、それがエラーを示していますが

int c=print((int*)a) 

これらの3の違いは何ですかを使用して呼び出されたときに正しい出力を与えますか?

+0

私は、これはC++であることを前提と - 'のstd :: array'を使用しないのはなぜ? –

+0

なぜ 'print'は値を返しませんか? –

+0

'int'を返す関数を定義し、その関数の実装に' return'文を含まないとします。値を返さなかった関数の戻り値を使うとどう思いますか?そして、あなたはその機能が適切に機能することをどのように期待しますか?コードを書くことについて学ぶ最も重要なことは、実際にあなたが書いているコードを** **読んで、それが何をしているのかを理解することです。 –

答えて

-2

最初にお読みください:ここに記載されている方法では、メモリリークが発生することがあります。メモリの配置とサイズについて考慮せずにポインタをキャストすることはできません。

  1. これは悪い呼び出しです。

    int c=print(int *a); 
    
  2. これは、あなたが「」それ以外の場合、あなたのコンパイラの警告に注意を払う、メモリリークを有していてもよく、intへのポインタであることを確認する必要があり、正しい方法でなければなりません。この場合your'reはintへのポインタで、あなたが本当に持っていないもののいない問題であるためにそれを強制的に、Aの明示的なキャストを行うことで

    int c=print(a); 
    
  3. 、あなたはメモリリークを引き起こす可能性があり、注意を払いますコンパイラの警告。

    int c=print((int*)a); 
    

あなたはこの概念について非常に明確でない場合は、C/C++でのポインタを操作する注

は非常に危険です。ポインタをキャストしないと、この段階でエラーが発生すると致命的なメモリリークが発生する可能性があります。メモリリークは、このような状況によって引き起こされるメモリ不調和です。ポインタが正しいキャストにないときに、プログラムやその一部がクラッシュする可能性があります。あなたのタイトルについて

: "int型*" と "(INT *)" との違いについて尋ね

Your're、あなたの質問はよく形成されていません。それは次のようになります。

「関数の引数としてポインタを渡すための正しい方法は何である」

+0

最初の電話はなぜ悪い電話ですか?また、 'a'はintへのポインタであることを示します。関数の引数とすべての引数を定義する際に使用します。 –

+0

case1は、関数を定義するときに実行するコードを記述しているため、悪い呼び出しです。これはエラーです。 case2または3のように進んでください。 case3では、これは「キャスト」と呼ばれ、ポインタから別のポインタへの明示的な変換です。 – christian

+0

@HunarJain:これは単なる構文エラーなので意味がありません。関数の引数を定義する際にそれを使用するという事実は無関係であり、完全に異なる文脈でそれを使用することは問題ではありません。 'int c = print(こんにちは、コンパイラ!これはint ----> aへのポインタです);' 'は' a'がintへのポインタであることを示しますが、構文エラーでもあります。 –

関連する問題