横浜国立大学 理工学部 数物・電子情報系学科
アドレス(
32bit
)中身( 1記憶単位は 8bit)
… …
0x 40ea 0800 1101 0000
0x 40ea 0801 0000 0111
0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0100 1100
0x 40ea 0805 1000 1110
0x 40ea 0806 1010 0100
0x 40ea 0807 1101 0000
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 1100
0x 40ea 080d 0110 1111
0x 40ea 080e 1010 0111
0x 40ea 080f 0101 0000
0x 40ea 0810 1101 0000
… …
計算機の記憶(メモリ)の構造:
•
すべての記憶領域には、記憶単位ごとに 連続する番号(アドレス)が付されている•
記憶単位の中身には、値が書き込まれている• CPU
は、任意のアドレスを指定することで そのアドレスの記憶領域の中身を読み出す
/
書き込むことができる
(
Random Access Memory : RAM
) たとえば、アドレス
0x40ea080a
番地の中身は、01000001
(
ASCII
コードなら’ A’
、10
進数なら65
)•
(システムによって異なるがここでは)•
アドレスは32bit
(左図では16
進表記)•
記憶単位は8bit (
単位は[Byte])
•
アドレスは0x00000000
~0xffffffff
なので、
2
32=4GByte
の空間が限界0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0000 0000
0x 40ea 0805 0000 0000
0x 40ea 0806 0000 0000
0x 40ea 0807 0001 0100
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 1100
0x 40ea 080d 0110 1111
0x 40ea 080e 1010 0111
0x 40ea 080f 0101 0000
0x 40ea 0810 1101 0000
… …
return 0;
}
00000000 00000000 00000000 00010100
a
int
型(32bit
) この場合のa
は?→
int
型(32bit
の箱)の変数a
は、中身が
20
(2
進数では10100
)実行すると、以下の結果が出た。
a: 40ea0804 = 20
a
は、物理的にどこに存在する?→ 記憶(メモリ)の中
(OSに割り当ててもらう; 毎回変
わる)
a
は、具体的にどこ?→ 今回は
0x 40ea 0804
番地からの4
バイ ト分&a a
アドレス(
32bit
)中身(1記憶単位は 8bit)
… …
0x 40ea 0800 1101 0000
0x 40ea 0801 0000 0111
0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0000 0000
0x 40ea 0805 0000 0000
0x 40ea 0806 0000 0000
0x 40ea 0807 0001 0100
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 1100
0x 40ea 080d 0110 1111
0x 40ea 080e 1010 0111
0x 40ea 080f 0101 0000
0x 40ea 0810 1101 0000
… …
&a a
int main(void) {
int a;
int *ap;
ap = &a;
a = 20;
printf(“a:%x = %d\n”, &a, a);
*ap = *ap +1;
printf(“ap:%x=%d\n”, ap, *ap);
return 0;
}
0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0000 0000
0x 40ea 0805 0000 0000
0x 40ea 0806 0000 0000
0x 40ea 0807 0001 0100
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 0000
0x 40ea 080d 1110 1010
0x 40ea 080e 0000 1000
0x 40ea 080f 0000 0100
0x 40ea 0810 1101 0000
&a a
ap = &a;
a = 20;
printf(“a:%x = %d\n”, &a, a);
*ap = *ap +1;
printf(“ap:%x=%d\n”, ap, *ap);
return 0;
}
0x 40ea 0804 ap
ポインタ型(
32bit
)代入
アドレスを「値」として保持
アドレス(
32bit
)中身(1記憶単位は 8bit)
… …
0x 40ea 0800 1101 0000
0x 40ea 0801 0000 0111
0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0000 0000
0x 40ea 0805 0000 0000
0x 40ea 0806 0000 0000
0x 40ea 0807 0001 0100
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 0000
0x 40ea 080d 1110 1010
0x 40ea 080e 0000 1000
0x 40ea 080f 0000 0100
0x 40ea 0810 1101 0000
… …
&a a
int main(void) {
int a;
int *ap;
ap = &a;
a = 20;
printf(“a:%x = %d\n”, &a, a);
*ap = *ap +1;
printf(“ap:%x=%d\n”, ap, *ap);
return 0;
}
a: 0x40ea0804=20
と表示0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0000 0000
0x 40ea 0805 0000 0000
0x 40ea 0806 0000 0000
0x 40ea 0807 0001 0100
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 0000
0x 40ea 080d 1110 1010
0x 40ea 080e 0000 1000
0x 40ea 080f 0000 0100
0x 40ea 0810 1101 0000
&a a
ap = &a;
a = 20;
printf(“a:%x = %d\n”, &a, a);
*ap = *ap +1;
printf(“ap:%x=%d\n”, ap, *ap);
return 0;
}
a: 0x40ea0804=20
&a:
変数a
がメモリのどこにあるかを示す変数
a
に格納されている値アドレス(
32bit
)中身(1記憶単位は 8bit)
… …
0x 40ea 0800 1101 0000
0x 40ea 0801 0000 0111
0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0000 0000
0x 40ea 0805 0000 0000
0x 40ea 0806 0000 0000
0x 40ea 0807 0001 0100
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 0000
0x 40ea 080d 1110 1010
0x 40ea 080e 0000 1000
0x 40ea 080f 0000 0100
0x 40ea 0810 1101 0000
… …
&a a
int main(void) {
int a;
int *ap;
ap = &a;
a = 20;
printf(“a:%x = %d\n”, &a, a);
*ap = *ap +1;
printf(“ap:%x=%d\n”, ap, *ap);
return 0;
}
0x 40ea 0804 ap
ポインタ型(
32bit
) アドレスを「値」として保持0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0000 0000
0x 40ea 0805 0000 0000
0x 40ea 0806 0000 0000
0x 40ea 0807 0001 0100
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 0000
0x 40ea 080d 1110 1010
0x 40ea 080e 0000 1000
0x 40ea 080f 0000 0100
0x 40ea 0810 1101 0000
0x 40ea 0804 ap
ポインタ型(
32bit
) 参照先はint
型ap = &a;
a = 20;
printf(“a:%x = %d\n”, &a, a);
*ap = *ap +1;
printf(“ap:%x=%d\n”, ap, *ap);
return 0;
}
アドレス(
32bit
)中身(1記憶単位は 8bit)
… …
0x 40ea 0800 1101 0000
0x 40ea 0801 0000 0111
0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0000 0000
0x 40ea 0805 0000 0000
0x 40ea 0806 0000 0000
0x 40ea 0807 0001 0100
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 0000
0x 40ea 080d 1110 1010
0x 40ea 080e 0000 1000
0x 40ea 080f 0000 0100
0x 40ea 0810 1101 0000
… …
int main(void) {
int a;
int *ap;
ap = &a;
a = 20;
printf(“a:%x = %d\n”, &a, a);
*ap = *ap +1;
printf(“ap:%x=%d\n”, ap, *ap);
return 0;
}
0x 40ea 0804 ap
ポインタ型(
32bit
) 参照先はint
型*ap
*:参照そのアドレスの 内容を見る
参照先の大きさ(型)は 宣言で指定したとおり。
すなわち、
int *ap;
より、*apは int型
0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0000 0000
0x 40ea 0805 0000 0000
0x 40ea 0806 0000 0000
0x 40ea 0807 0001 0101
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 0000
0x 40ea 080d 1110 1010
0x 40ea 080e 0000 1000
0x 40ea 080f 0000 0100
0x 40ea 0810 1101 0000
ap = &a;
a = 20;
printf(“a:%x = %d\n”, &a, a);
*ap = *ap +1;
printf(“ap:%x=%d\n”, ap, *ap);
return 0;
}
0x 40ea 0804 ap
ポインタ型(
32bit
) 参照先はint
型*ap
参照先の中身に1
を加える*:参照そのアドレスの 内容を見る
参照先の大きさ(型)は 宣言で指定したとおり。
すなわち、
int *ap;
より、*apは int型
アドレス(
32bit
)中身(1記憶単位は 8bit)
… …
0x 40ea 0800 1101 0000
0x 40ea 0801 0000 0111
0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0000 0000
0x 40ea 0805 0000 0000
0x 40ea 0806 0000 0000
0x 40ea 0807 0001 0101
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 0000
0x 40ea 080d 1110 1010
0x 40ea 080e 0000 1000
0x 40ea 080f 0000 0100
0x 40ea 0810 1101 0000
… …
int main(void) {
int a;
int *ap;
ap = &a;
a = 20;
printf(“a:%x = %d\n”, &a, a);
*ap = *ap +1;
printf(“ap:%x=%d\n”, ap, *ap);
return 0;
}
*ap
ap: 0x40ea0804=21
と表示0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0000 0000
0x 40ea 0805 0000 0000
0x 40ea 0806 0000 0000
0x 40ea 0807 0001 0101
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 0000
0x 40ea 080d 1110 1010
0x 40ea 080e 0000 1000
0x 40ea 080f 0000 0100
0x 40ea 0810 1101 0000
ap = &a;
a = 20;
printf(“a:%x = %d\n”, &a, a);
*ap = *ap +1;
printf(“ap:%x=%d\n”, ap, *ap);
return 0;
}
*ap
ap: 0x40ea0804=21
ap:
メモリのどこかを示すap
の参照先(*ap
)に 格納されている値アドレス(
32bit
)中身(1記憶単位は 8bit)
… …
0x 40ea 0800 1101 0000
0x 40ea 0801 0000 0111
0x 40ea 0802 0100 1011
0x 40ea 0803 1011 1111
0x 40ea 0804 0000 0000
0x 40ea 0805 0000 0000
0x 40ea 0806 0000 0000
0x 40ea 0807 0001 0101
0x 40ea 0808 0100 0001
0x 40ea 0809 1011 0111
0x 40ea 080a 0100 0001
0x 40ea 080b 1101 0000
0x 40ea 080c 0100 0000
0x 40ea 080d 1110 1010
0x 40ea 080e 0000 1000
0x 40ea 080f 0000 0100
0x 40ea 0810 1101 0000
… …
&a a
int main(void) {
int a;
int *ap;
ap = &a;
a = 20;
printf(“a:%x = %d\n”, &a, a);
*ap = *ap +1;
printf(“ap:%x=%d\n”, ap, *ap);
return 0;
}
0x 40ea 0804 ap
ポインタ型(
32bit
) 参照先はint
型00000000 00000000 00000000 00010101
a
int
型(32bit
) 2つの変数(箱)a
の中身は21
ap
の中身はa
のアドレス(&a)
&ap ap
*ap
21
a
のアドレス を代入しておくa = 20; a
printf(“a:%x = %d\n”, &a, a);
*ap = *ap +1;
printf(“ap:%x=%d\n”, ap, *ap);
return 0;
}
0x 40ea 0804 ap
ポインタ型(
32bit
)00000000 00000000 00000000 00010101
a
int
型(32bit
) 2つの変数(箱)a
の中身は21
ap
の中身はa
のアドレス(&a)
ap
*ap
a
の箱を参照(参照先は
int
型)a
のアドレス21 a
ap
*ap
int a;
int *ap;
ap = &a;
&a
ポインタ:まとめ
21 a
ap
(参照先はint
型)(注意)※ 何型へのポインタであっても、ポインタ変数には一律、アドレスが格納される。
参照するとき(
*
をつけたとき)やポインタ演算を行うとき(ap+1
など)に、型を適用する。※ ポインタをつかって参照する際には、必ず「実体」(変数や割当済み領域)が必要
ap = &a;
変数
a
のアドレスを代入→ 変数
a
へのポインタ(
ap
はa
を指し示す。)&a: a
の実体が存在するメモリのアドレス
ap
はa
を指し示す。HTML
ドキュメント内での記述:<a href=“http://www.tommylab.ynu.ac.jp/lecture/Algorighm/05/05.pdf”>
第5
回資料</a>
参照元の
HTML
ドキュメントに05.pdf
が埋め込まれているわけではない。参照元には
URL
(アドレス)のみが埋め込まれる。実体は参照先に存在する。WWW
サーバwww.tommylab.ynu.ac.jp
http://www.tommylab .ynu.ac.jp/lecture/Alg
orighm/05/05.pdf URL
Web
上のドキュメント参照:ドキュメント
05.pdf
へのポインタ05.pdf
の実体参照の例
関数
f1
のブロック内だけで有効な仮引数x
と、関数
f2
の仮引数xp
(ポインタ変数)に渡されたポインタの違いに注目f2
からは、main
関数のブロック内だけで有効な変数a
にポインタを使って参照することができる。
/****************************************************************
アルゴリズムとデータ構造 サンプルプログラム pointer.c <<アドレスとポインタ>>
copyright (c) 1995,96,97 T.Mori <[email protected]>
****************************************************************/
#include <stdio.h>
void f1(int x);
void f2(int *xp);
main() { int a;
a = 1;
printf("a == %d\n", a);
printf("start: f1(a)\n");
f1(a);
printf("done: f1(a)\n");
printf("a == %d\n", a);
/* &a は変数aの値が保持されている番地 */
/* printfの引数の中の%uは,%dとほぼ同じだが符合なし(正の)の整数として印刷 */
printf("&a == %u\n", &a);
printf("start: f2(&a)\n");
f2(&a);
printf("done: f2(&a)\n");
printf("a == %d\n", a);
return 0;
}
/* 変数の値を仮引数(自動変数)に代入し,そのデータを改変する */
/* 呼び出し側の変数の値はもちろん変わらない */
void f1(int x) {
printf(" x == %d\n", x);
x = x + 1;
printf(" x == %d\n", x);
}
/* 変数へのポインタ(番地)を仮引数に渡し,その番地にあるデータを改変する */
/* 呼び出し側の変数の値も変わる */
void f2(int *xp) {
printf(" xp == %u\n", xp);
printf(" *xp == %d\n", *xp);
*xp = *xp + 1;
printf(" xp == %u\n", xp);
printf(" *xp == %d\n", *xp);
}
仮引数
int x void f1( int x )
x
の値を表示x++
x
の値を表示戻り値なし(
void
)xp
の値(アドレス)を表示
*xp++
*xp
の値(中身)を表 示xp
の値(アドレス)を*xp
の値(中身)を表表示 示f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
a = 1;
printf("a == %d\n", a);
printf("start:
f1(a)\n");
f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
int main( void) 1
変数
int a
&a==4026529420d
f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
a==1 start: f1(a)
a = 1;
printf("a == %d\n", a);
printf("start:
f1(a)\n");
f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
int main( void) 1
変数
int a
a==1 start: f1(a)
&a==4026529420d
1
仮引数
int x
void f1( int x )
x
の値を表示x++
x
の値を表示f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
a==1 start: f1(a)
f1(1)
1
仮引数
int x
戻り値なし(
void
)void f1( int x )
x
の値を表示x++
x
の値を表示a = 1;
printf("a == %d\n", a);
printf("start:
f1(a)\n");
f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
int main( void) 1
変数
int a
a==1 start: f1(a) x == 1
f1(1)
&a==4026529420d
2
仮引数
int x
void f1( int x )
x++
x
の値を表示f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
a==1 start: f1(a) x == 1
f1(1)
x
の値を表示2
仮引数
int x
戻り値なし(
void
)void f1( int x )
x
の値を表示a = 1;
printf("a == %d\n", a);
printf("start:
f1(a)\n");
f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
int main( void) 1
変数
int a
a==1 start: f1(a) x == 1 x == 2
f1(1)
x
の値を表示x++
&a==4026529420d
2
仮引数
int x
void f1( int x )
f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
a==1 start: f1(a) x == 1
x == 2
x
の値を表示x++
x
の値を表示re tu rn
a = 1;
printf("a == %d\n", a);
printf("start:
f1(a)\n");
f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
int main( void) 1
変数
int a
a==1 start: f1(a) x == 1 x == 2 done: f1(a) a==1
&a==4026529420d start: f2(&a)
&a==4026529420d
f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
a==1 start: f1(a) x == 1 x == 2 done: f1(a) a==1
&a==4026529420d start: f2(&a)
4026529420
仮引数
int *xp
戻り値なし(
void
)void f2( int *xp )
xp
の値(アドレス)を 表示*xp++
*xp
の値(中身)を表 示xp
の値(アドレス)を*xp
の値(中身)を表表示 示a = 1;
printf("a == %d\n", a);
printf("start:
f1(a)\n");
f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
int main( void) 1
変数
int a
a==1 start: f1(a) x == 1 x == 2 done: f1(a) a==1
&a==4026529420d start: f2(&a)
&a==4026529420d
f2(40 2652 9420 )
戻り値なし(
void
)xp
の値(アドレス)を表示
*xp++
*xp
の値(中身)を表 示xp
の値(アドレス)を*xp
の値(中身)を表表示 示f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
a==1 start: f1(a) x == 1 x == 2 done: f1(a) a==1
&a==4026529420d start: f2(&a)
f2(40 2652 9420 )
Call by Value
(注意)
C
言語での関数呼び出しは、値渡しによる関数呼び出しのみ
Call by Value
ポインタ(アドレスの値)を渡すことによって、
別の関数内の自動変数(や、確保された領域)に
仮引数
int *xp
戻り値なし(
void
)void f2( int *xp )
xp
の値(アドレス)を 表示*xp++
*xp
の値(中身)を表 示xp
の値(アドレス)を*xp
の値(中身)を表表示 示a = 1;
printf("a == %d\n", a);
printf("start:
f1(a)\n");
f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
int main( void) 1
変数
int a
a==1 start: f1(a) x == 1 x == 2 done: f1(a) a==1
&a==4026529420d start: f2(&a)
&a==4026529420d
f2(40 2652 9420 )
戻り値なし(
void
)xp
の値(アドレス)を表示
*xp++
*xp
の値(中身)を表 示xp
の値(アドレス)を*xp
の値(中身)を表表示 示f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
a==1 start: f1(a) x == 1 x == 2 done: f1(a) a==1
&a==4026529420d start: f2(&a)
xp== 4026529420d *xp==1
f2(40 2652 9420 )
仮引数
int *xp
戻り値なし(
void
)void f2( int *xp )
*xp++
xp
の値(アドレス)を*xp
の値(中身)を表表示 示a = 1;
printf("a == %d\n", a);
printf("start:
f1(a)\n");
f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
int main( void) 2
変数
int a
a==1 start: f1(a) x == 1 x == 2 done: f1(a) a==1
&a==4026529420d start: f2(&a)
xp== 4026529420d *xp==1
&a==4026529420d
f2(40 2652 9420 )
xp
の値(アドレス)を*xp
の値(中身)を表表示 示戻り値なし(
void
)xp
の値(アドレス)を*xp
の値(中身)を表表示 示f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
a==1 start: f1(a) x == 1 x == 2 done: f1(a) a==1
&a==4026529420d start: f2(&a)
xp== 4026529420d *xp==1
f2(40 2652 9420 )
xp
の値(アドレス)を*xp
の値(中身)を表表示 示*xp++
仮引数
int *xp
戻り値なし(
void
)void f2( int *xp )
a = 1;
printf("a == %d\n", a);
printf("start:
f1(a)\n");
f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
int main( void) 2
変数
int a
a==1 start: f1(a) x == 1 x == 2 done: f1(a) a==1
&a==4026529420d start: f2(&a)
xp== 4026529420d *xp==1
xp== 4026529420d *xp==2
&a==4026529420d
xp
の値(アドレス)を*xp
の値(中身)を表表示 示*xp++
return
xp
の値(アドレス)を*xp
の値(中身)を表表示 示f1(a);
printf("done:
f1(a)\n");
printf("a == %d\n", a);
printf("&a == %u\n",
&a);
printf("start:
f2(&a)\n");
f2(&a);
printf("done:
f2(&a)\n");
printf("a == %d\n", a);
return 0;
a==1 start: f1(a) x == 1 x == 2 done: f1(a) a==1
&a==4026529420d start: f2(&a)
xp== 4026529420d *xp==1
xp== 4026529420d *xp==2