ようこそ ゲスト さん、新規登録(無料)して気になる疑問を解決しませんか?

質問

質問者:tobasu 参照型 int や構造体では違う?
困り度:
  • すぐに回答を!
以下のようにポインタを使ったものを参照型にしようと、
void test(int &a, int &b, int n)と書いている最中に
本当に中で a[i]とかしても大丈夫か心配になりました。
int a[] と int *aでは同じなので、 int &aとしても単純に同じ
と判断しましたが、正しくはどうすれば下のサンプルが
参照型の引数で動くか教えてください。

void test(int a[], int b[], int n)
{
for (int i=0; i<n; i++) {
b[i] = a[i];
}
}
質問投稿日時:08/05/04 00:08
質問番号:3995788
この質問に対する回答は締め切られました。
最新から表示回答順に表示良回答のみ表示

回答

良回答20pt

回答者:jacta > void test(int* &a,int* &b,int n)
> void test(int a[], int b[], int n)
>
> が同じ意味とは知りませんでした。

同じ意味ではありません。

配列を参照渡ししたいのであれば、次のようにします。

template <int N>
void test(int (&a)[N], int (&b)[N])
{
 for (int i = 0; i < N; i++)
  b[i] = a[i];
}

ただし、実引数が配列型でなければなりません。
具体的には、

int a[10];
int b[10];
test(a, b); // OK

int* pa = new a[10];
int* pb = new b[10];
test(pa, pb); // エラー
test(*reintertret_cast<int(*)[10]>(pa), *reinterpret_cast<int(*)[10]>(pb)); // OK

ということです。
種類:回答
どんな人:専門家
自信:参考意見
回答日時:08/05/04 13:10
回答番号:No.2
この回答へのお礼この回答にお礼をつける(質問者のみ)

回答

良回答10pt

回答者:buriburi3 >int a[] と int *aでは同じなので
a[]は定数、*aは変数なので同じではありません。
例をどうしても参照型で使いたい場合int *a,*bである必要があります。
int a[],b[]では参照渡しは出来ません。

…前略…
main()
{
 int *a,*b,n=10 ;
 a = new int [n] ;
 b = new int [n] ;
 …中略…
 test(a,b,n) ;
 …中略…
}

void test(int* &a,int* &b,int n)
{
 for (int i=0; i<n; i++) { // ←この書き方良くないYo
  b[i] = a[i];
 }
}

testの中でa,bの領域を確保したいとかなら参照渡しの意味がありますが、単純にtest()の中のように
  b[i] = a[i];
と書きたいだけならa,bが参照渡してある必要は無く普通にアドレス渡しで良いのでは
…前略…
main()
{
 int a[10],b[10],n=10 ;
 …中略…
 test(a,b,n) ;
 …中略…
}

void test(int* a,int* b,int n)
{
 for (int i=0; i<n; i++) { // ←この書き方良くないYo
  b[i] = a[i];
 }
}
種類:回答
どんな人:専門家
自信:自信あり
回答日時:08/05/04 05:02
回答番号:No.1
この回答への補足丁寧なご回答、ありがとうございます。

void test(int* &a,int* &b,int n)
void test(int a[], int b[], int n)

が同じ意味とは知りませんでした。


>for (int i=0; i<n; i++) { // ←この書き方良くないYo

よくわからないのですが、何がいけないのでしょうか?
この回答へのお礼この回答にお礼をつける(質問者のみ)
 
最新から表示回答順に表示良回答のみ表示