• 検索結果がありません。

アルゴリズムとデータ構造 補足資料 5-1 「メモリとポインタ」

N/A
N/A
Protected

Academic year: 2021

シェア "アルゴリズムとデータ構造 補足資料 5-1 「メモリとポインタ」"

Copied!
39
0
0

読み込み中.... (全文を見る)

全文

(1)

横浜国立大学 理工学部 数物・電子情報系学科

(2)

アドレス

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

の空間が限界

(3)

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

(4)

アドレス

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;

}

(5)

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

代入

アドレスを「値」として保持

(6)

アドレス

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

と表示

(7)

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

に格納されている値

(8)

アドレス

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

アドレスを「値」として保持

(9)

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;

}

(10)

アドレス

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

(11)

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

(12)

アドレス

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

と表示

(13)

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

)に 格納されている値

(14)

アドレス

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

(15)

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

のアドレス

(16)

21 a

ap

*ap

int a;

int *ap;

ap = &a;

&a

ポインタ:まとめ

(17)

21 a

ap

(参照先は

int

型)

(注意)※ 何型へのポインタであっても、ポインタ変数には一律、アドレスが格納される。

参照するとき(

*

をつけたとき)やポインタ演算を行うとき(

ap+1

など)に、型を適用する。

※ ポインタをつかって参照する際には、必ず「実体」(変数や割当済み領域)が必要

ap = &a;

変数

a

のアドレスを代入

変数

a

へのポインタ

ap

a

を指し示す。)

&a: a

の実体が

存在するメモリのアドレス

ap

a

を指し示す。

(18)

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

pdf

ファイル

http://www.tommylab .ynu.ac.jp/lecture/Alg

orighm/05/05.pdf URL

Web

上のドキュメント参照:

ドキュメント

05.pdf

へのポインタ

05.pdf

の実体

参照の例

(19)

関数

f1

のブロック内だけで有効な仮引数

x

と、

関数

f2

の仮引数

xp

(ポインタ変数)に渡されたポインタの違いに注目

f2

からは、

main

関数のブロック内だけで有効な変数

a

ポインタを使って参照することができる。

(20)

/****************************************************************

アルゴリズムとデータ構造 サンプルプログラム 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);

}

(21)

仮引数

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;

(22)

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

(23)

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)

(24)

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

(25)

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)

(26)

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

(27)

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

の値を表示

(28)

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

(29)

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

(30)

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

(31)

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)

(32)

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 )

(33)

戻り値なし(

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

ポインタ(アドレスの値)を渡すことによって、

別の関数内の自動変数(や、確保された領域)に

(34)

仮引数

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 )

(35)

戻り値なし(

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 )

(36)

仮引数

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

の値(中身)を表表示

(37)

戻り値なし(

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++

(38)

仮引数

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

の値(中身)を表表示

(39)

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

参照

関連したドキュメント

前章 / 節からの流れで、計算可能な関数のもつ性質を抽象的に捉えることから始めよう。話を 単純にするために、以下では次のような型のプログラム を考える。 は部分関数 (

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計

例えば、総トン数 499 トン・積載トン数 1600 トン主機関 1471kW(2000PS)の内航貨 物船では、燃料油の加熱に使用される電力は

各テーマ領域ではすべての変数につきできるだけ連続変量に表現してある。そのため

「特殊用塩特定販売業者」となった者は、税関長に対し、塩の種類別の受入数量、販売数

いてもらう権利﹂に関するものである︒また︑多数意見は本件の争点を歪曲した︒というのは︑第一に︑多数意見は

6  の事例等は注目される。即ち, No.6

(注)本報告書に掲載している数値は端数を四捨五入しているため、表中の数値の合計が表に示されている合計