II 2008 1023 http www ns kogakuin ac

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

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

&演算子 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です. 11

&演算子 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です. 12

&演算子 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です. 13

配列とアドレス(ポインタ) 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です. 34

配列とアドレス(ポインタ) 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です. 35

ポインタ演算 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 38

関数の仮引数と実引数(値渡し) 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 53

関数の仮引数と実引数(値渡し) 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 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); } 実行結果 3 100 番地 3 57

関数の仮引数と実引数(参照渡し) 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 59

関数の仮引数と実引数(参照渡し) 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 番地 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 番地 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 p 100 番地 104 番地 108 番地 3 100 番地 番地 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 番地 7 100 番地 番地 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); } 実行結果 7 x px 100 番地 104 番地 7 100 番地 64

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); } 65

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); } 66

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); } 67

応用例: 値を 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); } 76

応用例: 値を 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番地であったとする. 78

応用例: 値を 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番地であったとする. 81