質問 |
||
| 質問者: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 よくわからないのですが、何がいけないのでしょうか? |
| この回答へのお礼 | この回答にお礼をつける(質問者のみ) |