| Home |
2009/01/07 Wed 23:41
C言語メモ
大事なところなのでメモしておきます。
●ポインタとは
ある変数のメモリー上のアドレスを指すもの、と考える。
配列や構造体とかを使うときに活用すると便利っぽい。
○ポインタの使い方
ポインタ変数の宣言
int* p;
型のあとに*をつける。複数宣言時は int *p,*pp; とか。
型のあとに*をつけるのと変数名の前に*をつけるのとサイトによってまちまちですが、
意味合いとしてはint*型というものでpを宣言するって感じで覚えて
あとは書き方の問題、とすれば良いかもしれません。
ポインタ変数に代入
int a = 10;
int *p;
p = &a;
先に述べたとおり、ポインタ変数はある変数のアドレスを指すもの。
すなわち、最初に代入するものはアドレスとなる。
上記の例ではpにはaのアドレスが入っており、
aのアドレスに10が入っている、ということになる。
アドレスが何なのかを見る
printf("%d", *p);
pに格納されているアドレスを参照して、そのアドレスに何が入っているのかを見る。
上記の例では先ほど入れたaのアドレスに何があるのかを見ているため、10が出力される。
ここまでのまとめ
普通に宣言した変数の扱い
int a;
a
変数aの値を示す。
&a
こうすると変数aアドレスを示す。
ポインタ変数の扱い
int* p;
p
アドレスを示す。
*p
アドレスの先の値を示す。
確認はprintfしてください。
ポインタ変数をいじる
int a = 10;
int* p;
p = &a;
p++;
こうするとpは最終的に何を返すのか。
pに入っているのはアドレスです。アドレスに+1するので次のアドレスにとぶ。
ここで注意するのは飛ぶ数。
単純に1バイト増加するのではなく、型の大きさの分だけ増加する。
int型の場合4バイトなので、アドレスも4バイト増える。
aさんという家は150m地点から154m地点まである。
その次の?さんという家は154m地点から158m地点まである。
と考えると分かりやすいかも。
で、p++したあとに*pを出力するとどうなるかというと、
その次のアドレスは何も宣言されてないし何も入れられてないので
何があるかわからない、出鱈目なデータが出力される。
ポインタ変数に代入する
*p = 15;
こうするとポインタ変数に入っているアドレスの先に数値を入れる。
pにはaのアドレスが入っているので、結果的にaが書き換わるという形になる。
ここまでのまとめ
p++;
とか、
p+=5;
とか、
pを直接増減させた場合、変わるのはアドレス。
言ってみればpさん宅から次の家、5件先の家を新たにpさん宅と設定する。
*p = 1;
とか、
*p = a + 10;
とか、
*pとしてそれに値を代入する場合、変わるのは家の中身。
pに入ってるアドレス上に存在する変数の中身を変える。
言ってみれば今現在の、pさん宅に宅配便をぶち込む。
つづく。
●ポインタとは
ある変数のメモリー上のアドレスを指すもの、と考える。
配列や構造体とかを使うときに活用すると便利っぽい。
○ポインタの使い方
ポインタ変数の宣言
int* p;
型のあとに*をつける。複数宣言時は int *p,*pp; とか。
型のあとに*をつけるのと変数名の前に*をつけるのとサイトによってまちまちですが、
意味合いとしてはint*型というものでpを宣言するって感じで覚えて
あとは書き方の問題、とすれば良いかもしれません。
ポインタ変数に代入
int a = 10;
int *p;
p = &a;
先に述べたとおり、ポインタ変数はある変数のアドレスを指すもの。
すなわち、最初に代入するものはアドレスとなる。
上記の例ではpにはaのアドレスが入っており、
aのアドレスに10が入っている、ということになる。
アドレスが何なのかを見る
printf("%d", *p);
pに格納されているアドレスを参照して、そのアドレスに何が入っているのかを見る。
上記の例では先ほど入れたaのアドレスに何があるのかを見ているため、10が出力される。
ここまでのまとめ
普通に宣言した変数の扱い
int a;
a
変数aの値を示す。
&a
こうすると変数aアドレスを示す。
ポインタ変数の扱い
int* p;
p
アドレスを示す。
*p
アドレスの先の値を示す。
確認はprintfしてください。
ポインタ変数をいじる
int a = 10;
int* p;
p = &a;
p++;
こうするとpは最終的に何を返すのか。
pに入っているのはアドレスです。アドレスに+1するので次のアドレスにとぶ。
ここで注意するのは飛ぶ数。
単純に1バイト増加するのではなく、型の大きさの分だけ増加する。
int型の場合4バイトなので、アドレスも4バイト増える。
aさんという家は150m地点から154m地点まである。
その次の?さんという家は154m地点から158m地点まである。
と考えると分かりやすいかも。
で、p++したあとに*pを出力するとどうなるかというと、
その次のアドレスは何も宣言されてないし何も入れられてないので
何があるかわからない、出鱈目なデータが出力される。
ポインタ変数に代入する
*p = 15;
こうするとポインタ変数に入っているアドレスの先に数値を入れる。
pにはaのアドレスが入っているので、結果的にaが書き換わるという形になる。
ここまでのまとめ
p++;
とか、
p+=5;
とか、
pを直接増減させた場合、変わるのはアドレス。
言ってみればpさん宅から次の家、5件先の家を新たにpさん宅と設定する。
*p = 1;
とか、
*p = a + 10;
とか、
*pとしてそれに値を代入する場合、変わるのは家の中身。
pに入ってるアドレス上に存在する変数の中身を変える。
言ってみれば今現在の、pさん宅に宅配便をぶち込む。
つづく。
「そ」って何?→これ
| Home |

