ポインタ死ね。
■ このスレッドは過去ログ倉庫に格納されています
0516デフォルトの名無しさん
2006/04/04(火) 21:32:28馬鹿でもわかるようにヒマツブシのついでにせつめいしてやろうか。
ここでポインタレベルという概念を導入する。以下の変数はそれぞれコメントのようなポインタレベルになる。
int A0;//ポインタレベル0。
int *A1;//ポインタレベル1。
int** A2;//ポインタレベル2。
これらのポインタレベルが異なる変数は互いに代入は不可能である。
代入したいときには、変数同士のポインタレベルを合わせてやらなければならない。
ここでポインタ演算にからむ演算子”*”と”&”、”[ ]”についてその意味を定義する。
*はポインタレベルを1下げる。
&はポインタレベルを1上げる。
hoge[n]はhogeの値にnだけプラスをしたものを新しく生成し、さらにポインタレベルを1下げる。→ *(hoge+n)
ただし配列生成時の new hoge[n]は別の意味である。これは単にhogeをn個生成する記述である。
つまりあるポインタレベルの変数をポインタレベルが異なる変数に代入するには、これらの演算子を使ってポインタレベルを同じにしてやればよい。
なおポインタレベルは0より小さくはならない。
A2 = &A1;//正しい。ポインタレベル1のA1のを&演算子でポインタレベルを1上げてポインタレベル2の変数に代入。
A2 = &A0;//間違い。A2に代入するにはポインタレベルが足りない。
A1 = *A2;//正しい。ポインタレベル2のA2に*演算子を使いポインタレベルを1下げているのでA1と同じポインタレベルである。
A0 = *A2;//間違い。A0よりA2のポインタレベルが1高い。
A1 = A2[1];//正しい。A2の値に1を加算してできたもののポインタレベルを1下げてA1に代入している。
ただし、この説明は構文的にエラーにならないようになるだけであり、文脈によってはメモリ破壊を起こす記述も有り得るので注意が必要である。
■ このスレッドは過去ログ倉庫に格納されています