ポインタを関数で使用するときのまとめ。
10年ぶりにC言語を書いて忘れていたので、思い出したのをまとめてみる。
関数をまたぐをわけわからなくなってくる。嵌るポイントはここ。
2重ポインタ ダブルポインタ ポインタのポインタ
値渡し=内容が別のアドレスにコピーされる。呼び出し元とは別ものになる。
関数に値を渡すとき何もしないと値渡しになるから、ポインタを渡すとポインタに格納されているアドレス自身を値渡しすることになる。
なので、渡した関数の中でアドレスを変更すると、値渡しなので関数終了時にアドレスが入った箱が破棄されるので、呼び出し元には反映されない。
関数内でmallocなどでアドレスを変更する場合は2重ポインタで渡せば、2重ポインタのアドレス自身が破棄されても、その実体であるポインタは残るので内容は維持できる。
内容を触るぶんには、アドレスは変更されないので問題なし。ポインタを値渡しすればよし。
●まとめ
・ポインタを関数に渡すとき、
mallocする場合、二重ポインタで渡す。
内容のみを触る場合、ポインタをそのまま値渡しすればOK
・3重ポインタなどは要らない
●ソース
#include <stdio.h>
void funcA(unsigned char **);
void funcAA(unsigned char *);
void funcB(unsigned char *);
void funcBB(unsigned char *);
void funcC(unsigned char **);
void funcCC(unsigned char ***);
void funcD(unsigned char **);
void funcDD(unsigned char ***);
void funcE(unsigned char **);
void funcEE(unsigned char **);
int main(){
unsigned char *szA;
unsigned char *szB;
unsigned char *szC;
unsigned char *szD;
unsigned char *szE;
printf(“nポインタ渡し→malloc→値渡し→内容を編集n”);
funcA(&szA);
printf(“A:%sn”,szA);
printf(“n値渡し→malloc→値渡し→内容を編集n”);
funcB(szB);
printf(“B:%sn”,szB);
printf(“nポインタ渡し→malloc→ポインタ渡し→内容を編集n”);
funcC(&szC);
printf(“C:%sn”,szC);
printf(“nポインタ渡し→ポインタ渡し→malloc→内容を編集n”);
funcD(&szD);
printf(“D:%sn”,szD);
printf(“nポインタ渡し→値渡し→malloc→内容を編集n”);
funcE(&szE);
printf(“E:%sn”,szE);
}
void funcA(unsigned char **szDoublePointer){
*szDoublePointer = (unsigned char *)malloc(100);
memset(*szDoublePointer,’