• ベストアンサー

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

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

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

  • ベストアンサー
回答No.1

ナカミを壊される心配がありません。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

回答No.4

今回の例の構造体は小さいからあまりでメリットになりませんが サイズの大きな構造体だと、値で渡すと関数の呼び出しのオーバーヘッドが大きくなります。 struct sample { int i; char string[1024]; double x[1000]; }; これを値で渡していたら・・・。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

おっと失礼。 ポインタで渡す場合のデメリット test2関数で変更した内容によって、test2関数を呼び出している側において本来内容を変えてほしくない領域が不用意に書き換わる

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

値で渡す場合のメリット test1関数でいくら内容を変更しても、test1関数を呼び出している側での構造体の内容を不用意に壊すことがない 値で渡す場合のデメリット test1関数でいくら内容を変更しても、test1関数を呼び出している側に 変更内容を伝えられない ポインタで渡す場合のメリット test2関数で変更した内容が、test2関数を呼び出している側に的確に伝わる ポインタで渡す場合のデメリット test2関数で変更した内容によって、test2関数において本来内容を変えてほしくない領域が不用意に書き換わる メリットとデメリットは上記のように裏返しです。 プログラムを書く側の責任で、状況に応じて使い分けることが肝要でありましょう。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ポインタが指す構造体メンバの値の表示について

    ポインタが指す構造体メンバの値の表示について 下記のプログラムの*pは、saのエイリアスで、pが指すオブジェクトのメンバxは(*p)..xと表示されているが、*p.xまたは、*(p.x)は、文法的正しくないと書かれいる本が多いのでその理由を教えて頂きたい。 ****************************************************************** int main(void) { struct xyz { int x ; long y ; double z; } sa = {50, 99999999L ,3.14}; struct xyz *p =&sa; printf("(*p).x %d\n", (*p).x);

  • 構造体とポインタ

    演習問題を解いていて「構造体ポインタの指定の方法」で理解できない部分があったので、質問させていただきます。 その内容は、メイン関数で「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型では駄目だというのはわかるのですが、それでは他に何を指定すればいいのかわからないのです。 もしよければ、アドバイスをいただけると嬉しいです。 よろしくお願いします。

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

    関数の戻り値を構造体の配列(アドレスを受け渡しを利用して)にしたいのですがうまくゆきません。 以下のプログラムではコンパイルはできるのですが、 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言語初心者です。 下のコードはリスト構造のサンプルコードを元に自分で書き直そうとしているコードです。(なので、現時点では不完全なところ(例えばfreeしてないとか)があるのと、自分で理解出来ていない箇所があります。) 実行すると、8から3までの値が一応表示されるようになったですが、その過程の仕組みが自分でもよく理解出来ていません。 (1)tra *q = NULL; 通常、構造体のポインタを使用するときはq = &___のように他の構造体のアドレスを渡して使用出来るようにすると思いますが、ここではなぜ*qに、NULLを代入する必要があるのでしょうか。 (2)そのNULL状態のポインタqを関数printingdudeに突っ込んで結果的に8、7、6、、と出力されるまでの過程がよくわかりません。簡単に解説して頂けると助かります。(ちょっと雑な質問になってしまい申し訳ありません) typedef struct transcript{ int no; struct transcript *next; } tra; void printingdude(struct transcript *m); tra* noud(int v, tra* c); int main(){ tra *q = NULL; int i; for(i = 8; i>1; i--){ printingdude(q); q = noud(i, q); } return; } void printingdude(struct transcript *m){ if(m ==NULL) return; printf("%d\n", m->no); } tra* noud(int v, tra* c){ tra *a = (tra *) malloc(sizeof(tra)); a->no = v; a->next = c; return a; }

  • 構造体の配列を関数に渡すには

    構造体の配列を関数の引数として渡そうとすると エラーになってしまいます ネットで調べてもいまいちわからなかったので ここで質問させてもらいます #include<stdio.h> struct A{   ・    ・    ・ }; void func(struct A *p); int main(void) { struct A x[3][4] = {     ・     ・     ・ }; func(x); return 0; } void func(struct A *p){     ・     ・    ・ } どうすれば渡すことができるのでしょうか? どなたか助言お願いします。

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

  • 異なる複数の構造体のスマートな使用方法

    構造体のビットフィールドを複数作成し、 条件によってどの構造体を使用するかを決定し データ取得しようとしています。 同じ型の構造体の配列はできますが、 異なる構造体が複数ある場合、配列のように 参照する方法はないでしょうか? スマートなやり方があれば、ご教授お願い致します。 以下、やろうとしていることの簡易版、 /* ----例----------------------------------*/ int test = 1; if( test == 1){ /* 構造体test01を使用し値参照 */ } else if( test == 2){ /* 構造体test02を使用し値参照 */ } else if( ........ /* 以下同じような処理 */ struct test01{ unsigned int bit01: 1; unsigned int bit02: 15; } struct test02{ unsigned int bit01: 2; unsigned int bit02: 14; } struct test03{ unsigned int bit01: 3; unsigned int bit02: 13; } /* 同様の構造体がつづく*/ /* --------------------------------------*/

  • 構造体の纏め方

    関数のポインタを使用して、 /* プロトタイプ宣言 */ void func1 ( void ); void func2 ( void ); void func3 ( void ); /*******************/ /* プロトタイプ纏める */ void ( *funcs[] ) ( void ) = { func1, func2, func3 }; /*********************/ と言うのが、構造体でも出来ないでしょうか?と言うのが質問です。 変数(添字)によって、見るべき構造体を自由に変更させたいと言うのが主な使用方法です。 typedef struct _tag { int arg1; int arg2; } tag; tag watch1 , watch2 , watch3; とある変数が1なら、watch1、とある変数が2なら、watch2、とある変数が3なら、watch3を見ると言うようなプログラムにしたくて、質問しました。 witch文を使うしかないのでしょうか? 良き回答、お待ちしています。

  • 構造体メンバ 構造体ポインタ 値代入

    typedef struct _test_t{ int aaa; int bbb; } test_t; typedef struct _globalData{ int xxx; test_t* pTestData[256]; } globalData_t; globalData_t globalData; int main(){ test_t testData1 = {1,1}; test_t testData2 = {2,2}; *globalData.pTestData[1] = testData1; /* (1) */ globalData.pTestData[2] = &testData1; /* (2) */ } 上記のようなグローバルデータの構造体globalData のメンバの構造体配列にtest_t型の構造体を格納し保持するには、 (1)、(2)のどちらが正しいでしょうか?

  • C言語構造体についてです。

    C言語、π=PI 3.14159265で構造体を用いてmensekiを呼び出して 半径と面積を計算して出力するプログラムです。下の空白を埋めてもらえますか? /* 構造体のプログラム */ #include <stdio.h> #include <math.h> #define PI 3.14159265 struct Data { /* 半径rと面積areaをdoubleで宣言 */ }; void menseki(struct ... 構造体のポインタを引数とする ){ /* 面積を計算する際に構造体のアドレスから計算する */ circle->area=PI* .....; } main(){ struct Data example[2]; //構造体配列 int i; /* 半径rを構造体配列を用いて2例入力する */ /* 2例の各々について mensekiを呼び出して 半径と面積を計算して出力する */ } よろしくお願いします。