II 2010 1014 http www ns kogakuin ac

  • Slides: 87
Download presentation
プログラミング論 II 2010年 10月14日 ポインタ http: //www. ns. kogakuin. ac. jp/~ct 13140/Prog. 2010/

プログラミング論 II 2010年 10月14日 ポインタ http: //www. ns. kogakuin. ac. jp/~ct 13140/Prog. 2010/

&演算子 void main(){ char abc, def, ghi; printf("アドレスは%p %p %pです.n", &abc, &def, &ghi); }

&演算子 void main(){ char abc, def, ghi; printf("アドレスは%p %p %pです.n", &abc, &def, &ghi); } 実行結果 アドレスは 0013 FF 7 C 0013 FF 78 0013 FF 74です. C-12

&演算子 void main(){ char abc[5]; printf("アドレスは%p %pn%p %p %pです.n", &(abc[0]), &(abc[1]), &(abc[2]), &(abc[3]), &(abc[4]));

&演算子 void main(){ char abc[5]; printf("アドレスは%p %pn%p %p %pです.n", &(abc[0]), &(abc[1]), &(abc[2]), &(abc[3]), &(abc[4])); } 実行結果 アドレスは 0013 FF 78 0013 FF 79 0013 FF 7 A 0013 FF 7 B 0013 FF 7 Cです. C-13

&演算子 void main(){ int abc[5]; printf("アドレスは%p %pn%p %p %pです.n", &(abc[0]), &(abc[1]), &(abc[2]), &(abc[3]), &(abc[4]));

&演算子 void main(){ int abc[5]; printf("アドレスは%p %pn%p %p %pです.n", &(abc[0]), &(abc[1]), &(abc[2]), &(abc[3]), &(abc[4])); } int型は 4バイト 実行結果 アドレスは 0013 FF 6 C 0013 FF 70 0013 FF 74 0013 FF 78 0013 FF 7 Cです. C-14

配列とアドレス(ポインタ) void main(){ char abc[5]; printf("アドレスは%p %pn%p %p %pです.n", &(abc[0]), &(abc[1]), &(abc[2]), &(abc[3]), &(abc[4]));

配列とアドレス(ポインタ) void main(){ char abc[5]; printf("アドレスは%p %pn%p %p %pです.n", &(abc[0]), &(abc[1]), &(abc[2]), &(abc[3]), &(abc[4])); } 実行結果 アドレスは 0013 FF 78 0013 FF 79 0013 FF 7 A 0013 FF 7 B 0013 FF 7 Cです. C-35

配列とアドレス(ポインタ) void main(){ int abc[5]; printf("アドレスは%p %pn%p %p %pです.n", &(abc[0]), &(abc[1]), &(abc[2]), &(abc[3]), &(abc[4]));

配列とアドレス(ポインタ) void main(){ int abc[5]; printf("アドレスは%p %pn%p %p %pです.n", &(abc[0]), &(abc[1]), &(abc[2]), &(abc[3]), &(abc[4])); } 実行結果 アドレスは 0013 FF 6 C 0013 FF 70 0013 FF 74 0013 FF 78 0013 FF 7 Cです. C-36

ポインタ演算 char ch[10]; char *p; p = ch; printf("%pn", p); p++; printf("%pn", p); 実行結果

ポインタ演算 char ch[10]; char *p; p = ch; printf("%pn", p); p++; printf("%pn", p); 実行結果 0013 FF 74 0013 FF 75 C-39

関数の仮引数と実引数(値渡し) void func(int a){ a = 7; } x void main(){ int x =

関数の仮引数と実引数(値渡し) void func(int a){ a = 7; } x void main(){ int x = 3; func(x); printf("%dn", x); } 100 番地 3 C-54

関数の仮引数と実引数(値渡し) void func(int a){ a = 7; } x void main(){ int x =

関数の仮引数と実引数(値渡し) void func(int a){ a = 7; } x void main(){ int x = 3; func(x); printf("%dn", x); } 100 番地 3 C-55

関数の仮引数と実引数(値渡し) void func(int a){ a = 7; } x void main(){ int x =

関数の仮引数と実引数(値渡し) void func(int a){ a = 7; } x void main(){ int x = 3; func(x); printf("%dn", x); } 実行結果 3 100 番地 3 C-58

関数の仮引数と実引数(参照渡し) void func(int *p){ *p = 7; } void main(){ int x = 3;

関数の仮引数と実引数(参照渡し) void func(int *p){ *p = 7; } void main(){ int x = 3; int *px; px = &x; func(px); printf("%dn", x); } x px 100 番地 104 番地 3 C-60

関数の仮引数と実引数(参照渡し) void func(int *p){ *p = 7; } void main(){ int x = 3;

関数の仮引数と実引数(参照渡し) void func(int *p){ *p = 7; } void main(){ int x = 3; int *px; px = &x; func(px); printf("%dn", x); } x px 100 番地 104 番地 3 100 番地 C-61

関数の仮引数と実引数(参照渡し) void func(int *p){ *p = 7; } void main(){ int x = 3;

関数の仮引数と実引数(参照渡し) void func(int *p){ *p = 7; } void main(){ int x = 3; int *px; px = &x; func(px); printf("%dn", x); } x px 100 番地 104 番地 3 100 番地 C-62

関数の仮引数と実引数(参照渡し) void func(int *p){ *p = 7; } void main(){ int x = 3;

関数の仮引数と実引数(参照渡し) void func(int *p){ *p = 7; } void main(){ int x = 3; int *px; px = &x; func(px); printf("%dn", x); } x px p 100 番地 104 番地 108 番地 3 100 番地 番地 C-63

関数の仮引数と実引数(参照渡し) void func(int *p){ *p = 7; } void main(){ int x = 3;

関数の仮引数と実引数(参照渡し) void func(int *p){ *p = 7; } void main(){ int x = 3; int *px; px = &x; func(px); printf("%dn", x); } x px p 100 番地 104 番地 108 番地 7 100 番地 番地 C-64

関数の仮引数と実引数(参照渡し) void func(int *p){ *p = 7; } void main(){ int x = 3;

関数の仮引数と実引数(参照渡し) void func(int *p){ *p = 7; } void main(){ int x = 3; int *px; px = &x; func(px); printf("%dn", x); } 実行結果 7 x px 100 番地 104 番地 7 100 番地 C-65

void main(){ 練習 0 int i, *j, k; i = 3; j = &i;

void main(){ 練習 0 int i, *j, k; i = 3; j = &i; k = i; *j = 4; k = 5; printf("i=%dn", i); } C-66

void main(){ 練習 1 int i[2], *j; i[0]=3; i[1]=7; j=i; j++; printf("%dn", *j); }

void main(){ 練習 1 int i[2], *j; i[0]=3; i[1]=7; j=i; j++; printf("%dn", *j); } C-67

void main(){ 練習 2 int i[2], *j; i[0]=3; i[1]=7; j=i; (*j)++; printf("%dn", *j); }

void main(){ 練習 2 int i[2], *j; i[0]=3; i[1]=7; j=i; (*j)++; printf("%dn", *j); } C-68

応用例: 値を 2個返す関数 C言語では,戻り値は 1個しか用意できない. void sq_cu(int n, int *ps, int *pc){ *ps =

応用例: 値を 2個返す関数 C言語では,戻り値は 1個しか用意できない. void sq_cu(int n, int *ps, int *pc){ *ps = n*n; *pc = n*n*n; squareが100番地, } cubeが104番地で void main(){ あったとする. int square, cube; sq_cu(3, &square, &cube); printf("%d %dn", square, cube); } C-77

応用例: 値を 2個返す関数 C言語では,戻り値は 1個しか用意できない. void sq_cu(int n, int *ps, int *pc){ *ps =

応用例: 値を 2個返す関数 C言語では,戻り値は 1個しか用意できない. void sq_cu(int n, int *ps, int *pc){ *ps = n*n; nが3, *pc = n*n*n; psが100番地, pcが104番地として } 関数sq_cuを開始. void main(){ int square, cube; sq_cu(3, &square, &cube); printf("%d %dn", square, cube); } squareが100番地, cubeが104番地であったとする.C-79

応用例: 値を 2個返す関数 C言語では,戻り値は 1個しか用意できない. void sq_cu(int n, int *ps, int *pc){ *ps =

応用例: 値を 2個返す関数 C言語では,戻り値は 1個しか用意できない. void sq_cu(int n, int *ps, int *pc){ *ps = n*n; 実行結果 *pc = n*n*n; 9 27 } void main(){ int square, cube; sq_cu(3, &square, &cube); printf("%d %dn", square, cube); } squareが100番地, cubeが104番地であったとする.C-82

復習 i void main(){ int i=10, j=11; 104番地 int *p; の中身 p=&j; printf("*p=%dn", *p);

復習 i void main(){ int i=10, j=11; 104番地 int *p; の中身 p=&j; printf("*p=%dn", *p); *p=7; printf("i=%d j=%d", i, j); } 104番地 の中身 j p 100 104 108 番地 番地 番地 10 11 104 10 7 104 *p=11 実行結果 i=10 j=7 C-84

練習 3 void main(){ int x=10, y=11, z=12; int *p; printf("x=%d y=%d z=%dn", x,

練習 3 void main(){ int x=10, y=11, z=12; int *p; printf("x=%d y=%d z=%dn", x, y, z); p=&x; *p=5; printf("x=%d y=%d z=%dn", x, y, z); p=&y; *p=6; printf("x=%d y=%d z=%dn", x, y, z); p=&z; *p=7; printf("x=%d y=%d z=%dn", x, y, z); } 何と表示される? C-85

練習 4 void main(){ 何と表示される? int x[3]; int *p; x[0]=10; x[1]=20; x[2]=30; printf("x[0]=%d x[1]=%d

練習 4 void main(){ 何と表示される? int x[3]; int *p; x[0]=10; x[1]=20; x[2]=30; printf("x[0]=%d x[1]=%d x[2]=%dn", x[0], x[1], x[2]); p=x; /* p=&(x[0]) の意味 */ *p=7; printf("x[0]=%d x[1]=%d x[2]=%dn", x[0], x[1], x[2]); p++; *p=6; printf("x[0]=%d x[1]=%d x[2]=%dn", x[0], x[1], x[2]); p++; *p=5; printf("x[0]=%d x[1]=%d x[2]=%dn", x[0], x[1], x[2]); } C-87

練習 5 void main(){ 何と表示される? int x[3]; int *p; x[0]=10; x[1]=20; x[2]=30; printf("x[0]=%d x[1]=%d

練習 5 void main(){ 何と表示される? int x[3]; int *p; x[0]=10; x[1]=20; x[2]=30; printf("x[0]=%d x[1]=%d x[2]=%dn", x[0], x[1], x[2]); p=x; /* p=&(x[0]) の意味 */ *p=7; printf("x[0]=%d x[1]=%d x[2]=%dn", x[0], x[1], x[2]); (*p)++; printf("x[0]=%d x[1]=%d x[2]=%dn", x[0], x[1], x[2]); *p=6; printf("x[0]=%d x[1]=%d x[2]=%dn", x[0], x[1], x[2]); } C-89