• ベストアンサー

参照型 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]; } }

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> 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 ということです。

その他の回答 (1)

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.1

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

tobasu
質問者

補足

丁寧なご回答、ありがとうございます。 void test(int* &a,int* &b,int n) void test(int a[], int b[], int n) が同じ意味とは知りませんでした。 >for (int i=0; i<n; i++) { // ←この書き方良くないYo よくわからないのですが、何がいけないのでしょうか?

関連するQ&A

専門家に質問してみよう