アドレス渡し
関数にアドレスを渡すよ!
#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に入っている入れ物の住所は変わらないけど、
入れ物の中身は変わってるね。
関数の引数は大きく分けて、
「値渡し」と「アドレス渡し」しかないから覚えてね!
Leave a Comment