アドレス渡し

関数にアドレスを渡すよ!

#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