Document

ポインタ型変数と間接演算子の違い
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