LoginSignup
4
3

More than 5 years have passed since last update.

ポインタの話

Last updated at Posted at 2014-02-26

&とか*の意味

わかりやすいかわかりませんがたとえ話を思いつきました
一郎君と次郎君が、それぞれかご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)

このままではなにが便利なのか分かりません

使い道

関数内で引数となった変数の値を変えるとき
構造体と動的確保をつかってデータを扱うとき(後で出てくるよっ)

sample1.c
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'

寝ます
続きは明日

4
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3