warning: parameter ‘p’ set but not used
警告:引数 ‘p’ が上書き後未使用
[-Wunused-but-set-parameter]
■引数更新しても呼び元変わらず(整数版)
#include <stdio.h>
void 時給更新要求(
int 時給コピー
)
{
時給コピー = 2000 ;//コピーを変更しても原本は変わらない
}
int main(void) {
int 時給原本 = 1000 ; //1000円
printf("%d円\n",時給原本); //1000円
時給更新要求(時給原本); //更新されない
printf("%d円\n",時給原本); //1000円のまま
}
時給原本の値を1000円から2000円に変更したいのですが
更新されません。
C言語は Call by Value なので
呼び先の関数引数を更新しても、
呼び元の関数引数は更新されません。
つまり、
呼び先 時給更新要求()の引数「時給コピー」を更新しても
呼び元 main() 関数の引数「 時給原本」は更新されません。
■2.ポインタを使う修正例
#include <stdio.h>
void 時給更新要求(
int *時給原本保管場所
)
{
*時給原本保管場所 = 2000 ; //時給原本保管場所には時給原本がある
}
int main(void) {
int 時給原本 = 1000 ; //1000円
printf("%d円\n",時給原本); //1000円
時給更新要求(&時給原本); //時給原本の保管場所
printf("%d円\n",時給原本); //2000円になる
}
■引数更新しても呼び元変わらず(ポインタ版)
#include <stdio.h>
void 別の文字列を指したい(
char *ポインタ変数のコピー
) {
ポインタ変数のコピー = "コピーを変更しても呼び元は変わらない";
}
int main(void) {
char *ポインタ変数 = "ポインタが分らない";
printf("%s\n",ポインタ変数);
別の文字列を指したい(ポインタ変数);
printf("%s\n",ポインタ変数); //「ポインタが分からない」まま
}
■4.ポインタのポインタを使う修正例
#include <stdio.h>
void 別の文字列を指したい(
char **ポインタ変数のアドレス
){
*ポインタ変数のアドレス = "ポインタが分かった";
}
int main(void) {
char *ポインタ変数 = "ポインタが分らない";
printf("%s\n",ポインタ変数);
別の文字列を指したい(&ポインタ変数);
printf("%s\n",ポインタ変数); //「ポインタが分かった」!!
}
呼び元がポインタの場合も同様に
関数引数を
ポインタ(*)から
ポインタポインタ(**)に変更して
ポインタポインタの指す先を更新します。
参考:
CFAQ-4.8: 呼んだ側のポインターの値は変わらなかった。
http://www.kouno.jp/home/c_faq/c4.html#8
MSC13-C. 使用されない値を検出して削除する
https://www.jpcert.or.jp/sc-rules/c-msc13-c.html