11: 2011-07-08 (金) 21:29:37 yoshida | 12: 2011-07-08 (金) 22:02:27 yoshida | ||
---|---|---|---|
Line 174: | Line 174: | ||
****ポインタとは [#o91e72b0] | ****ポインタとは [#o91e72b0] | ||
+ | ポインタは実体をもちません。ポインタはメモリ上のどこかに確保されたデータのアドレスのみを受け渡します。 | ||
+ | 宣言方法は以下の通りです。 | ||
+ | #html{{ | ||
+ | <pre class="brush:c"> | ||
+ | char *a = "BEST"; | ||
+ | </pre> | ||
+ | }} | ||
#ref(pointer.png,100%) | #ref(pointer.png,100%) | ||
- | 使用方法は配列とあまり変わりません。~ | + | 使用方法は配列とあまり変わりませんが、BESTという文字列を操作するにはアドレスを介して操作するしかありませんので、*を間接演算子と呼びます。~ |
- | 但し、変数は配列数分メモリ領域には確保されず、メモリ上のどこかに確保されたデータのアドレスのみを受け渡します。BESTという文字列を操作するにはアドレスを介して操作するしかありませんので、*を間接演算子と呼びます。~ | + | 間接演算子の簡単な使い方を紹介します。 |
- | 以下にアドレス演算子を使用した場合と比較してみます。 | + | #html{{ |
- | | 状態 | アドレス演算子 | 間接演算子 | | + | <pre class="brush:c"> |
- | | 宣言 | int a; | int *a; | | + | #include <fd.h> |
- | | アドレスを渡す | b = &a; | b = a; | | + | void main (void) { |
- | | 内容を渡す | b = a; | b = *a; | | + | char *a = "BEST", *b; |
+ | int i = 0; | ||
+ | b = a; | ||
+ | while (*b++) i++; | ||
+ | fd_printf ("%s is %d byte\n", a, i); | ||
+ | } | ||
+ | </pre> | ||
+ | }} | ||
+ | b = a; | ||
+ | ポインタaが示すアドレスをポインタbへ代入します。(この時点でa/bは同じアドレスを指し示します)~ | ||
+ | while (*b++) i++; | ||
+ | これは以下の命令を簡素化したものです。 | ||
+ | while (1) { | ||
+ | if (*b == NULL) break; | ||
+ | b++; | ||
+ | i++; | ||
+ | } | ||
+ | |||
+ | 以下にアドレス演算子、配列を使用した場合と比較してみます。 | ||
+ | | 状態 | アドレス演算子 | 間接演算子 | 配列 | | ||
+ | | 宣言 | char a; | char *a; | char a[3]; | | ||
+ | | アドレスを渡す | b = &a; | b = a; | b = &a[0]; | | ||
+ | | 内容を渡す | b = a; | b = *a; | b = a[0]; | | ||
文字列の場合は配列と同じ扱いとなります。 | 文字列の場合は配列と同じ扱いとなります。 | ||
- | | アドレス | 文字 | 説明 | | + | "BEST"は、文字としては4文字ですが、メモリ上は5バイト確保されます。C言語では"BEST"は只の文字データが4つ集まっているだけであり、文字列としては扱われません。"BEST"の最後にNULLが付与されて初めて文字列として扱われます。~ |
- | | 00112239 | B |アドレスは例です | | + | |
- | | 0011223A | E | | | + | |
- | | 0011223B | E | | | + | |
- | | 0011223C | T | | | + | |
- | | 0011223D | Null |最後にNULLがセットされます | | + | |
- | BESTは、文字としては4文字ですが、メモリ上は5バイト確保されます。C言語ではBESTは只の文字データであり、文字列ではありません。BESTの最後にNULLが付与されて初めて文字列として扱われます。~ | + | |
つまり~ | つまり~ | ||
char *a = "BEST"; | char *a = "BEST"; | ||
は~ | は~ | ||
char a[5] = { 'B', 'E', 'S', 'T', NULL }; | char a[5] = { 'B', 'E', 'S', 'T', NULL }; | ||
- | と同じです。~ | + | と同じことです。~ |
- | このため、配列として扱い、インデックスを使用することで、文字の取得が可能です。以下はbに'E'を代入します。~ | + | このため、配列として扱うことで、文字の取得が可能となっています。以下はbに'E'を代入します。~ |
#html{{ | #html{{ | ||
<pre class="brush: c"> | <pre class="brush: c"> | ||
char *a = "BEST", b; | char *a = "BEST", b; | ||
- | b = a[1]; // 2文字目を代入します(インデックスは0から開始) | + | b = a[1]; // 2文字目を代入します |
</pre> | </pre> | ||
}} | }} | ||
Line 209: | Line 232: | ||
c = a; // アドレスをコピーします | c = a; // アドレスをコピーします | ||
c++; // アドレスを1つ進めます | c++; // アドレスを1つ進めます | ||
- | b = *c; // アドレスの示す内容を代入します | + | b = *c; // アドレスの示す内容(E)を代入します |
</pre> | </pre> | ||
}} | }} |