- ベストアンサー
参照型 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]; } }
- みんなの回答 (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)
>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]; } }
補足
丁寧なご回答、ありがとうございます。 void test(int* &a,int* &b,int n) void test(int a[], int b[], int n) が同じ意味とは知りませんでした。 >for (int i=0; i<n; i++) { // ←この書き方良くないYo よくわからないのですが、何がいけないのでしょうか?