#&とか*の意味
わかりやすいかわかりませんがたとえ話を思いつきました
一郎君と次郎君が、それぞれかごxとかごyを持っています
一郎君の持つかごxにはりんごが3個 、 次郎君の持つかごyにはりんごが5個 入っています
このとき、 x=3 y=5 もしくは、 一郎のかご=3 次郎のかご=5 と表すことができますよね?
この2つ目の表現がポインタによる表現に似ています
こうじゃ
かご | 持つ人 | 数 | 表現1 | 表現2 |
---|---|---|---|---|
x | 一郎 | 3 | x=3 | 一郎のかご=3 |
y | 次郎 | 5 | y=5 | 次郎のかご=5 |
この表の、 持つ人をメモリ上の位置と考える とポインタの話になります
C言語では、 xの位置を、 &x
と書きます (上のたとえだと、 &x=一郎
のようになります)
そして、逆に メモリのある位置に入っているデータの中身を知る こともできます
*(メモリ上の位置)
と書きます
たとえば、 p=&x
のとき *p
とすることができます( *一郎=3
)
(このメモリ上での位置を、 アドレス 、と言います)
( p
のようにアドレスを入れる変数を ポインタ と言います)
こうです
変数 | アドレス | 値 | 表現1 | 表現2(ポインタ) |
---|---|---|---|---|
x | &x | 3 | x=3 | *(&x)=3 |
y | &y | 5 | y=5 | *(&y)=5 |
これらを使い、このような表現ができます
( だいぶいまさらですがコンパイル通りませんでした.あとで書き直します. )
int x = 1;
int *y; // *yは、y(←ポインタ)がさすデータ
y = &x; // yをxのアドレス(そこには1が入っている)に変える
printf("%d", *y); // y(xのアドレス)の場所のデータを表示(1を表示する)
// つまり*yは*(&x)となる
x = 2;
printf("%d", *y); // y(xのアドレス)の場所のデータを表示(2を表示する)
// これも*yは*(&x)
このままではなにが便利なのか分かりません
#使い道
関数内で引数となった変数の値を変えるとき
構造体と動的確保をつかってデータを扱うとき(後で出てくるよっ)
void func1(int x){
x = 1;
}
void func2(int *x){ // 参照渡し
*x = 1;
}
int main(void){
int n1 = 0;
int n2 = 0;
func1(n1);
finc2(&n2);
printf("%d", n1); // 0
printf("%d", n2); // 1
}
#2重ポインタ(ポインタのポインタ)
配列、文字列を扱うときに使う
char str[] = "abcde";
// strは1文字目のアドレスを指す(中身は'a')
// 配列or文字列で、strと&str[0]は同じ意味
char *p; // ポインタ
char **pp; // ポインタのポインタ
p = str; // *pは'a'
寝ます
続きは明日