C ポインタ 新しいページはコチラ
提供: yonewiki
(→ポインタ) |
(→ポインタ) |
||
151行: | 151行: | ||
最初に配列を勉強すると、このようなポインタの表現が理解しづらいものに感じられますが、配列の[]を使った表現はポインタ変数の特殊な表記方法と思った方がいいのかもしれません。[]で配列を定義するとアドレス変数としての意識が薄れ、配列変数がポインタの役割をもっていることを忘れてしまいそうになります。例えば int a[1] = {200 , 210};のように定義するとaというint型の変数を定義したかのように錯覚してしまって混乱するのだと思います。それで、printf("%d", a);で要素0番目の出力をしようとしたりする間違いをしてしまうだろうなぁと思う。[] を使った配列宣言は初期値が設定できるのと、要素番号でメモリの確保ができるのが利点です。ポインタが配列変数であるためには初期化された配列のアドレスを上記の例のように受け取るか、new演算子やmalloc関数で動的にメモリを確保し生成する必要があります。 | 最初に配列を勉強すると、このようなポインタの表現が理解しづらいものに感じられますが、配列の[]を使った表現はポインタ変数の特殊な表記方法と思った方がいいのかもしれません。[]で配列を定義するとアドレス変数としての意識が薄れ、配列変数がポインタの役割をもっていることを忘れてしまいそうになります。例えば int a[1] = {200 , 210};のように定義するとaというint型の変数を定義したかのように錯覚してしまって混乱するのだと思います。それで、printf("%d", a);で要素0番目の出力をしようとしたりする間違いをしてしまうだろうなぁと思う。[] を使った配列宣言は初期値が設定できるのと、要素番号でメモリの確保ができるのが利点です。ポインタが配列変数であるためには初期化された配列のアドレスを上記の例のように受け取るか、new演算子やmalloc関数で動的にメモリを確保し生成する必要があります。 | ||
− | + | <syntaxhighlight lang="cpp"> | |
char* pcStrNew; | char* pcStrNew; | ||
pcStrNew = new char[256]; | pcStrNew = new char[256]; | ||
… | … | ||
delete[] pcStrNew; | delete[] pcStrNew; | ||
− | + | </syntaxhighlight> | |
ポインタ変数は所詮アドレスを保持しているだけの32bitアプリなら4byteの固定長の変数です。プログラムの中で配列変数を指し示すようになるって感じですが、アドレスのインクリメントとかで、メモリを確保していないアドレスとかに行くとプログラムは不正な処理をしたことになりますので注意が必要です。ポインタはどこへでもいけるけど、知らない場所にいくとすぐ検挙されます。悪さをしちゃいけないです。 | ポインタ変数は所詮アドレスを保持しているだけの32bitアプリなら4byteの固定長の変数です。プログラムの中で配列変数を指し示すようになるって感じですが、アドレスのインクリメントとかで、メモリを確保していないアドレスとかに行くとプログラムは不正な処理をしたことになりますので注意が必要です。ポインタはどこへでもいけるけど、知らない場所にいくとすぐ検挙されます。悪さをしちゃいけないです。 | ||
163行: | 163行: | ||
int pnAArr[1] = {200,210}; | int pnAArr[1] = {200,210}; | ||
− | |||
char pcStrComment[] = ”コメント”; | char pcStrComment[] = ”コメント”; | ||
− | |||
char cSingle = ’A’; | char cSingle = ’A’; | ||
− | + | のように定義でき、あとからpcStrCommentはポインタで、char* pcStrPos;char* pcPos;のような変数でpcStrPos = pcStrComment;という代入がプレフィックスが一致していることで正しいアドレス代入だと確信できます。 これを配列を使ったがばっかりにchar cStrComment[] = ”コメント”;としてしまうとpcPos = &cSinge;のようにできるとしてpcStrPos = cStrComment;って&がいるんだっけ?という迷いはなくなります。 | |
− | + | ||
− | + | ||
− | + | ||
− | char* pcPos; | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | という代入がプレフィックスが一致していることで正しいアドレス代入だと確信できます。 | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||