ポインタ型変数と間接演算子の違い int n; int *ptr; ←ptrは int型の変数を指すポインタ変数 n = 50; ptr = &n; *ptr = 70; この“*”は間接演算子(indirect operator) ptrが指している変数の中身が70に書き換えられる. ptr 80番地 : 104番地 n 104番地 : 70に書換 50 1 例1 int main(void){ int x = 50, y = 70; void swap1(int a, int b){ int tmp; tmp = a; a = b; b = tmp; } swap1(x, y); …. } x 50 a y 70 b x a y b 2 例1 int main(void){ int x = 50, y = 70; void swap1(int a, int b){ int tmp; tmp = a; a = b; b = tmp; } swap1(x, y); …. } x 50 a 50 y 70 b 70 x 50 a 70 y 70 b 50 x, y はかわらない 3 【 忘れないで!!!! 】 ポインタが指している変数の中味にアクセスするときは 間接参照を使う 例2 int main(void){ int x = 50, y = 70; void swap2(int *a, int *b){ int tmp; tmp = *a; *a = *b; *b = tmp; } swap2(&x, &y); …. } x 50 a y 70 b x a y b 4 【 忘れないで!!!! 】 ポインタが指している変数の中味にアクセスするときは 間接参照を使う 例2 int main(void){ int x = 50, y = 70; void swap2(int *a, int *b){ int tmp; tmp = *a; *a = *b; *b = tmp; } swap2(&x, &y); …. } x, yが入替わる (a, bが指す先 の中味) x 50 a y 70 b x 70 a y 50 b 5 構造体を指すときは? typedef struct{ unsigned char unsigned char unsigned char } PIXEL, *PPIXEL; r; g; b; px PIXEL構造体 200番地 x r int main(void){ //例 PIXEL x; PPIXEL px = &x; ... PIXEL *px = &x; } 200番地 g b 88 B1 E7 と書いても同じ 6 アロー演算子 -> pxが指すPIXEL構造体のメンバrの値を変えたい (*px).r = 5; 正しい px -> r = 5 でも同じ この“*”は間接演算子 ポインタ変数の宣言と混同しない! *px.r = 5; 正しくない (*(px.r) = 5と解釈される) px 5 x r g b 88 B1 E7 7 問題:変数に格納される値の変化を図示せよ int main(void){ PIXEL x; PPIXEL xp = &x; x.r = x.g = x.b = 3; proc_pel(xp); …. void proc_pel(PPIXEL ptr){ ptr -> r = 125; (*ptr).g = 30; } } 8 解答欄(ポインタや数値も記載すること) ①関数proc_pelを呼出す直前 x xp ②proc_pelが呼ばれた直後 ptr r g b ③proc_pel内の2行を実行後 x xp r g ptr b 9
© Copyright 2024 ExpyDoc