【C言語】
ポインタの使い方
ポインタのポインタ使用例

ポインタが 分からない

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() 関数の引数「 時給原本」は更新されません。 


➡ポインタを使って修正

#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",ポインタ変数);  //「ポインタが分からない」まま
}

➡ポインタのポインタを使って修正

#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