• ベストアンサー

参照型 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

  • 構造体を値で渡す良い点はありますか?

    C言語で以下のように引数に値を渡す場合とポインタを渡す場合では、 どんなメリットデメリットはあるのでしょうか? 普段はポインタばかり渡していたので、値を渡す経験がなく疑問に思いました。 構造体を値で渡す良い点はありますか? struct sample { int a; int b; }; void test1(struct sample sa){} void test2(struct sample *sa){}

  • C言語の参照はずしについて

    ソートのプログラムなんですが #include <stdio.h> #include <stdlib.h> int comp(const void *, const void *); int main() { int i; int test[6] = {10, 8, 2, 6, 4, 0}; qsort(test, (size_t)6, sizeof(int), comp); printf("\n"); for (i = 0; i < 6; i++) printf("%d\n", test[i]); return 0; } int comp(const void *a, const void *b) { static int i = 1; printf("%02d--%d,%d\n", i, *(int *)a, *(int *)b); i++; return (*(int *)a - *(int *)b); } 最後のreturnの()の中身がよくわかりません。「参照はずし」という事をしてるらしいんですが「参照はずし」とは何ですか意味も教えてください。

  • C言語で、引数が構造体の場合

    生徒の名前、点数、順位を表示するプログラムをつくりたいのですが、(下のような関数を用いることを前提として) void rank1(struct data *x,int n) { int i,j; for(i=0;i<n;i++) x[i].rank=1; for(i=0;i<n;i++) for(j=0;j<n;j++) if(x[i].score<x[j].score) x[i].rank++; } このような場合、関数の引数として、構造体が用いられているわけですよね? 引数が構造体の場合、どのように引数の部分を書けばいいのか分かりません。 私が考えたプログラムは下記の通りです。 もちろんうまくいきませんでした。 たぶん最後のprintfの所のrank1の引数が間違っているだけだと思うんですが、どうでしょうか? include<stdio.h> struct data { char name; int score; int rank; }; void rank1(struct data *x,int n) { int i,j; for(i=0;i<n;i++) x[i].rank=1; for(i=0;i<n;i++) for(j=0;j<n;j++) if(x[i].score<x[j].score) x[i].rank++; } void main(void) { int m; static struct data x[] = {{'A',56,1}, {'B',79,1}, {'C',34,1}, {'D',91,1}, {'E',69,1}}; for(m=0;m<5;m++) printf("%c君 %d点 %d位\n",x[m].name,x[m].score,rank1(x,m)); }

  • 参照型で受け取った引数をポインター型に渡す方法

    参照型で受け取った引数をポインター型に渡す場合は、 どのようにすればよいのでしょうか? 私は参照型の理解がすっぽりぬけています。 参照型はC++で導入された方法で、何がメリットで何がデメリットでしょうか? void pointer_test(AA *b) { ... } void test(AA &a) { pointer_test( ??? ); }

  • 関数 左辺値 参照 返り値 

    こんにちは。宜しくお願い致します。 > たとえば,下のサンプルプログラムでは関数fが参照を返すようになっているため,この関数fを代入の左辺においた,f(a, n) = 10;のような式が許される. > > #include <iostream> > using namespace std; > > int& f(int* a, int n) > { (2)~ return a[n]; > } > > int main(void) > { > const int n = 5; > int arr[n] = { 1, 2, 3, 4, 5 }; (1)~ f(arr, 3) = 10; > for (int i = 0; i < n; ++i) > cout << arr[i] << endl; > return 0; > } 上のサンプルプログラムで左辺値に参照を返す関数が(1)~あるのですが 動作が分りません。 関数内部の(2)~return a[n];というところで、関数の返り値int&の参照はa[n]という変数になるので、(1)~の結果としてa[n]に10が代入されるのでしょうか?教えてください。

  • 関数の中身

    整数型の配列dとデータの個数nを引数として受け取り、d[0]からd[n-1]までの内容を逆順に入れ替える関数void revをつくってます。 void rev(int d[],int n) { int a,b,i; a=n-1; b=1; for(i=1;i<=a;i++){ b[]=d[n-1]; n--; b++; } } と作ったのですが、うまく動きません。 どこがおかしいのでしょうか? 書き直してもらってかまいません。

  • ポインタ変数への参照について

    現在とあるDLLを作成中なのですが、メソッドの仕様で悩んでいます。 DLL内部で不正アクセス等を極力発生させないことを考えているのですが、ポインタを引数にとるメソッドの場合、引数に不正なアドレスを渡されるとメソッド内部で引数を参照した段階で不正アクセスで落ちてしまいます。この対応は、引数を参照とすることで解決しようと思っているのですが、ダブルポインタを引数にとるメソッドで同じ考え方をすると、メソッドの仕様が理解しづらいものになってしまいます。 下記がサンプルコードです。 class Test { public: Test() { m_test = 1; } int m_test; }; void GetTest1(Test** test) //もともとの仕様はこんな形 { *test = new Test(); } void GetTest2(Test*& test) //参照渡しにすると「*&」と書かなくてはならない { test = new Test(); } int main() { Test* get1; Test* get2; GetTest1(&get1); GetTest2(get2); delete get1; delete get2; return 0; } このように、「ポインタの参照」にすれば不正なポインタを渡される心配はなくなりますが。 「*&」など(私は)見たことも無いような記述になってしまいます。 このような書き方は一般的に考えて正しいのでしょうか? (特にDLLが提供するメソッドとして)

  • ポインタを使って構造体の配列を戻り値にするには

    関数の戻り値を構造体の配列(アドレスを受け渡しを利用して)にしたいのですがうまくゆきません。 以下のプログラムではコンパイルはできるのですが、 a0 = 2 a1 = 4198512 a2 = 4329332 と表示されてしまいa1,a2がうまくゆきません。 ********************************************* #include<stdio.h> struct test{ int a; }; struct test *func(void); void main(void) { struct test *data;//構造体ポインタ int i; data = func(); //ポインタにtest関数の戻り値(アドレス)を代入 for(i=0;i<=2;i++){   printf("a%d = %d\n",i,(data+i)->a); //構造体要素を表示 } } struct test *func(void) { struct test data[3]={1,2,3}; //構造体配列を定義 return (&data[0]); //構造体配列の先頭アドレスを返す } ************************************************* test関数から受ける取ったアドレス(&data[0])をポインタ(data)に代入して1づつずらして表示させれば a0=1,a1=2,a=3 となると思ったのですがどこが間違っているのでしょうか? よろしくお願いします。

  • 参照型の変数をポインタ引数を持つ関数に引数を書く方法

    C++の参照を使って以下のソースを試したのですが、 memmoveの引数のところでエラーが出ます。 memmoveの引数はポインタ型で合いません。 実体コピーしたい場合、どのようにすればよいのでしょうか? const AA &aとすれば、a自体が関数内で書き換わる心配がないので、 C++の参照型は、ポインタより安全と理解しているのですが その認識は間違っていないでしょうか? struct aa{ int x; int y; }AA; void test(AA &a) { AA b; memmove(b, a, sizeof(AA)); } void main(){ AA c; test(c); }

  • 構造体とポインタ

    演習問題を解いていて「構造体ポインタの指定の方法」で理解できない部分があったので、質問させていただきます。 その内容は、メイン関数で「scanf」で入力させた値を仮引数として計算する関数に送って計算し、メイン関数で表示処理を行うというものを、構造体とポインタを使って作るというものです。 とりあえずプログラムは以下のとおりになりました。 (字下げしたものが、下部のURL先にあります) #include <stdio.h> /***構造体***/ struct test{ int a; int b; }syoki[2] = { {0,0}, {0,0} }; /***値をプラスする関数***/ void kansu(struct test *no){ no->a++; no->b++; } /***メイン関数***/ void main(){ int nomber; //無限ループ for(;;){ printf("値を追加する番号を指定してください\n"); printf("(入力する値は、0か1)→"); scanf("%d", &nomber); //関数を呼び出す kansu(&nomber); //画面表示 printf("入力番号: %d\n",syoki); printf("値1: %d\n",syoki->a); printf("値2: %d\n",syoki->b); } } VisualStudio.NETのエラー内容では 「'int *__w64 ' から 'test *' に変換できません」 と表記されています。おそらくメイン関数で指定した「nomber」がint型では駄目だというのはわかるのですが、それでは他に何を指定すればいいのかわからないのです。 もしよければ、アドバイスをいただけると嬉しいです。 よろしくお願いします。