- ベストアンサー
C言語でのCharのアレイについての質問です。
C言語でCharのアレイをポインタとしてじゃなく、 valueとして、ほかの関数にパスする方法があれば、教えてください。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
tatsu99さんもおっしゃっている通り、引数を値渡しするということは、関数呼び出しのたびにコピーが行われると言うことです。単なる変数であれば、コピーも1度で済みますが、配列の場合、要素数分のコピーが行われることになり、その分、実行速度が低下します。そしてアドレス渡しにすることで、この欠点が改善されます。 なぜ、値渡しにしたいのか、理由が解らないのでなんとも言えませんが、アドレス渡しの場合、内容を変更される恐れがあるからと言う理由であれば、const指定を行うことで、変更しようとするとコンパイルエラーが出るようにできます。 (例) sub(char const * const str) 又は sub(const char * const str) *の左のconstはstrの指す内容を、右のconstはstr自身を更新できないと言う意味です。 どうしても値渡しにするのであれば、以下のプログラムのようにするのが一番簡単かもしれません(こういったことを考えたことがないので、もっと良い方法があるかもしれませんが) #include <stdio.h> #define MAX 10 typedef struct tagxxx{ char c[MAX]; } XXX; void sub1(XXX x){ int i; for(i=0;i<MAX-1;i++){ x.c[i]='A'; } printf("SUB1:%s\n",x.c); } void sub2(char *c){ int i; for(i=0;i<MAX-1;i++){ c[i]='A'; } printf("SUB2:%s\n",c); } void main(){ XXX x; int i; for(i=0;i<MAX-1;i++){ x.c[i]='X'; } x.c[MAX-1]='\0'; printf("MAIN1:%s\n",x.c); sub1(x); printf("MAIN2:%s <-変化していない。つまりsubには値が渡された\n",x.c); sub2(x.c); printf("MAIN2:%s <-変化している。つまりsubにはアドレスが渡された\n",x.c); }
その他の回答 (3)
- tatsu99
- ベストアンサー率52% (391/751)
一般的にValueとして渡す場合、コンパイラにより、その実体のコピーが作成され、そのコピーが渡される事になります。ポインターの場合は、実体のポインターが渡されるだけですので、それだけでもオーバーヘッドが、軽くてすみます。コピー作業のオーバーヘッドは、処理時間の増加につながりますので、従って、通常Value渡しは行いません。何故value渡しを行いたいのか、その辺の事情を説明されると、より良い回答が得られるかと思います。
お礼
ありがとうございました。
- D-Matsu
- ベストアンサー率45% (1080/2394)
引数が「char配列」でなくなってもよいのなら、構造体でラップするとかでどうでしょう。
- LOHA
- ベストアンサー率52% (203/388)
配列を値渡しすることは無理です。配列はポインタとしてでしか渡せません。 もし、それっぽいことがしたいのであれば、引数に配列の先頭アドレス(つまりポインタ)と、その配列のサイズを渡し、配列サイズ分だけmallocして領域を確保し、memcpyとかでコピーするという事をすることになりますね。
お礼
ありがとうございました。
お礼
おれいがおそくなってもうしわけありません。 ていねいに教えていただき助かりました。ありがとうございました。 またよろしくお願いします。