環境
使用しているIDEは、VSCodeで、コンパイルに用いているのは、以下のものです。
%gcc --version
Apple clang version 13.1.6 (clang-1316.0.21.2.5)
Target: arm64-apple-darwin21.5.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
では、本編行きましょう!
Q質問
些細な質問なんですけど、関数の中身で構造体の要素の一つしか使っていない場合の関数の引数は、構造体そのものを渡す方がいいですか?それとも構造体の要素だけを渡す方がいいですか?
A回答
値渡し(コピー)かポインタ渡し(先頭アドレス)かによって変わってくるような気がしますが、
要素の1つだけなら値渡し(コピー)でもポインタ渡し(先頭アドレス)でもあまり変わらないような気がします、という結論からお伝えしておきますねー。
C言語の構造体を引数に渡す際の僕の趣味
僕の趣味は、構造体の先頭アドレスを渡す方法が好きですね(え、聞いてない)。関数の中身で構造体の要素の一つしか使っていない場合とはかけはなれた場合の話になってしまいますが・・・。
【理由】
関数に行数制限がある場合、処理の途中で分割することがあります。
構造体の先頭アドレスを渡しておいて、なおかつ構造体の要素にwhileループ用のインデックス変数(例i,j,kなど)を含めておけば、例えばwhile2重ループの中で関数を分割して、分割した関数に構造体のアドレスだけ渡しておけば、引き続き、インデックスを反映させた処理を行えますね。
【注意点】
ただし、注意としては、分割した関数の中でインデックスを初期化しちゃうとバグになるという欠点がありましたね。なのでもしかしたら、インデックスは構造体に含めず、ちゃんと引数に記述したほうがバグが起こりにくいかもしれません。
しかし、構造体だけ引数にかけば全部引き継がれるのがすごくきれいでシンプルで「楽」で僕は好きです。
長ったらしくごめんなさい。ここまで読んでくれてありがとうございます!
以下、参考サイトと引用。
https://9cguide.appspot.com/16-02.html
普通に渡すことができる構造体を、ポインタ変数として渡す理由の
1つ目は、普通のポインタ変数と同じく、関数内で値を変更できるようにするためです。
ここでは試していませんが、関数内で値を変えると呼び出し元の変数の中身も変わります。
2つ目は、関数呼び出しの高速化のためです。
構造体を渡す時、その中身はすべてコピーされます。
構造体の中に、大きな配列があれば、その中身までまるごとコピーされます。
これは、当然ながらそれなりに時間のかかる処理となります。
しかし、ポインタのアドレス値を渡すだけなら、非常に高速です。
しかし、現代のコンピュータはとても高速なので、値渡しであっても、それほど問題にはなりません。
慣れないうちは、値渡しのほうが扱いやすいため、値渡しで行うことをおすすめします。