ポインタなど覚え書き
データ構造とかアルゴリズムの本のサンプルコードがC++で書かれていることが多いのでC++読めるようになりたい。 いきなりC++でもいいけど、下準備としてドットインストールのC入門をざっとやってみた。
if文の書き方とかセミコロンとかJavaScriptiに似てるな
文字列は文字charの配列。(終端の要素が"\0")
ある変数(x)は特定のメモリ領域(#XXXX)に対応しており、あるメモリ領域には特定の値(value_of_x)が入っている。
- たとえばnというint型変数(∈変数)は#0001というメモリ領域に対応しており、#0001というメモリ領域には"10"というint型の値が入っている。
ポインタもなんのことはない、変数の一種。
- たとえばpというポインタ(∈変数)は#0005というメモリ領域に対応しており、#0005というメモリ領域には"#1000"というアドレスが入っている。
&変数名
で、その変数が対応するメモリ領域のアドレスを返す。- たとえば
&n
は"#0001"を返し、&p
は"#0005"を返す。
- たとえば
*ポインタ名
で、そのポインタが指し示すアドレスに格納された値を返す。- #1000というメモリ領域に20という値が入っていた場合、
*p
は#1000に格納された"20"という値を返す。 - #1000というメモリ領域に#0001という値が入っていた場合、
*p
は#1000に格納された"#0001"という値を返す。**p
とするとさらに辿って、#0001に格納された"10"という値を返す。
- #1000というメモリ領域に20という値が入っていた場合、
ポインタの宣言
*p
がint型を返すようなポインタpを宣言するには、int* p
orint *p
と記述する(どちらも意味は同じ)。- 宣言に用いる「*」と、アドレスを辿って中身を返す「*」は別モノなので注意する。
*p
がアドレスを返すような「ポインタのポインタ」を宣言する場合には、辿る回数だけ*を重ねて、int** p
orint **p
と記述する。
ポインタpの中身をprintfするには、
printf("%p", p)