アドレス渡し
関数にアドレスを渡すよ!
#include <stdio.h>
void plusOne(char *p)
{
printf( "in func, *p = %d, p = 0x%016lX\n", *p, (unsigned long)p );
*p += 1;
printf( "in func, *p = %d, p = 0x%016lX\n", *p, (unsigned long)p );
}
int main(int argc, char *argv[])
{
char val = 0;
printf( "in main, &val = 0x%016lX\n", (unsigned long)&val );
printf( "in main, val = %d\n", val );
plusOne( &val );
printf( "in main, val = %d\n", val );
plusOne( &val );
printf( "in main, val = %d\n", val );
return 0;
}
実行結果
in main, &val = 0x00007FFF5FBFF90F
in main, val = 0
in func, *p = 0, p = 0x00007FFF5FBFF90F
in func, *p = 1, p = 0x00007FFF5FBFF90F
in main, val = 1
in func, *p = 1, p = 0x00007FFF5FBFF90F
in func, *p = 2, p = 0x00007FFF5FBFF90F
in main, val = 2
関数の引数には、入れ物の住所も渡せちゃうよ。
関数の引数に住所を渡す方法を、「アドレス渡し」って呼ぶよ。
他にも呼び方があるみたいだよ。
mainの中からplusOneを呼ぶときに渡した住所が、
char *pに入っているのが分かるかな?
mainの中で表示した住所と、plusOneの中で表示した住所が一緒だね。
その住所にある入れ物の中身を書き換えているのが、この行だよ。
*p += 1;
pに入っている入れ物の住所は変わらないけど、
入れ物の中身は変わってるね。
関数の引数は大きく分けて、
「値渡し」と「アドレス渡し」しかないから覚えてね!