痔になりやすい生活習慣とは?

以下のようにポインタを使ったものを参照型にしようと、
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];
}
}

このQ&Aに関連する最新のQ&A

A 回答 (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

ということです。
    • good
    • 0

>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

よくわからないのですが、何がいけないのでしょうか?

補足日時:2008/05/04 09:56
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


人気Q&Aランキング