3: 2011-06-27 (月) 12:18:37 yoshida | 4: 2011-06-27 (月) 21:13:53 yoshida | ||
---|---|---|---|
Line 120: | Line 120: | ||
アドレスとは変数がコンピュータのメモリのどこにあるかを指します。 | アドレスとは変数がコンピュータのメモリのどこにあるかを指します。 | ||
その名の通りコンピュータ上の住所のようなものです。~ | その名の通りコンピュータ上の住所のようなものです。~ | ||
- | アドレスの表し方は2通りあります。 | ||
&a | &a | ||
- | と書くと変数aのアドレスとなります。 | + | と書くと変数aのアドレスとなります。この&をアドレス演算子と呼びます。~ |
- | int a, b = 3; | + | 主に変数としてaが宣言されている場合に使用します。~ |
- | a = &b; | + | #html{{ |
- | aには3ではなく、bのアドレスの値が入ります。 | + | <pre class="brush: c"> |
+ | #include <fd.h> | ||
+ | void main (void) { | ||
+ | int a, b = 3; | ||
+ | fd_Wait (2000); | ||
+ | a = &b; | ||
+ | printf ("a=%d\n", a); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
+ | a=2103864 | ||
+ | aには3ではなく、bのアドレスの値が入ります。~ | ||
+ | |||
+ | ***ポインタ [#de8fd791] | ||
+ | アドレスを利用する別の方法としてポインタがあります。~ | ||
+ | char *a = "BEST"; | ||
+ | 以上がchar型のポインタ宣言となります。BESTという文字列はメモリ上のどこかに格納されており、そのアドレスを示しているのがポインタです。~ | ||
+ | BESTという文字列を操作するにはアドレスを介して操作するしかありません。そのため、*を間接演算子と呼びます。~ | ||
+ | 以下にアドレス演算子を使用した場合と比較してみます。 | ||
+ | | 状態 | アドレス演算子 | 間接演算子 | | ||
+ | | 宣言 | int a; | int *a; | | ||
+ | | アドレスを渡す | b = &a; | b = a; | | ||
+ | | 内容を渡す | b = a; | b = *a; | | ||
+ | 文字列の場合は配列と同じ扱いとなります。 | ||
+ | | アドレス | 文字 | 説明 | | ||
+ | | 00112239 | B |アドレスは例です | | ||
+ | | 0011223A | E | | | ||
+ | | 0011223B | E | | | ||
+ | | 0011223C | T | | | ||
+ | | 0011223D | Null |最後にNULLがセットされます | | ||
+ | BESTは、文字としては4文字ですが、メモリ上は5バイト確保されます。C言語ではBESTは只の文字データであり、文字列ではありません。BESTの最後にNULLが付与されて初めて文字列として扱われます。~ | ||
+ | つまり~ | ||
+ | char *a = "BEST"; | ||
+ | は~ | ||
+ | char a[5] = { 'B', 'E', 'S', 'T', NULL }; | ||
+ | と同じです。~ | ||
+ | このため、配列として扱い、インデックスを使用することで、文字の取得が可能です。 | ||
+ | #html{{ | ||
+ | <pre class="brush: c"> | ||
+ | char *a = "BEST", b; | ||
+ | b = a[1]; // 2文字目を代入します(インデックスは0から開始) | ||
+ | </pre> | ||
+ | }} | ||
+ | bにはEが代入されます。~ | ||
+ | ポインタを使用して文字の取得を行うことも可能です。~ | ||
+ | #html{{ | ||
+ | <pre class="brush: c"> | ||
+ | char *a = "BEST", b, *c; | ||
+ | c = a; // アドレスをコピーします | ||
+ | c++; // アドレスを1つ進めます | ||
+ | b = *c; // アドレスの示す内容を代入します | ||
+ | </pre> | ||
+ | }} | ||
+ | 配列として扱った時と同じように、bにはEが代入されます。~ |