11: 2011-07-08 (金) 21:29:37 yoshida ソース 現: 2011-08-09 (火) 20:23:18 takaboo ソース
Line 1: Line 1:
*C言語の基礎 [#pcd8150f] *C言語の基礎 [#pcd8150f]
-このページではFREEDOMライブラリを使用した場合のC言語について説明をします。~+このページでは[[FREEDOM IIIライブラリ>FDIIILIB]]を使用した場合のC言語について説明をします。~
**基本 [#f828bd2e] **基本 [#f828bd2e]
Line 33: Line 33:
1バイトで表すことができる数値は10進数で表すと0~255です。 1バイトで表すことができる数値は10進数で表すと0~255です。
-下表は10進数を2進数(1バイト)で表した例です。 +下表は10進数を2進数で表した例です。 
-| 10進数 | 2進数(1バイド) |+| 10進数 | 2進数 |
| 0 | 00000000 | | 0 | 00000000 |
| 50 | 00110010 | | 50 | 00110010 |
Line 40: Line 40:
| 200 | 11001000 | | 200 | 11001000 |
| 255 | 11111111 | | 255 | 11111111 |
 +
***変数 [#h0d4cb7f] ***変数 [#h0d4cb7f]
変数は数値や文字を置いておく入れ物です。~ 変数は数値や文字を置いておく入れ物です。~
Line 55: Line 56:
| 型の名前 | サイズ  | 入る値の範囲 | 備考 | | 型の名前 | サイズ  | 入る値の範囲 | 備考 |
-| int8_t  | 8ビット |    -128~127 | (8)ビット指定 |+| int8_t  | 8ビット |    -128~127 | 8ビット指定 |
| char    | 8ビット |    -128~127 | | | char    | 8ビット |    -128~127 | |
| uint8_t  | 8ビット | 0~255 | (8)ビット指定 | | uint8_t  | 8ビット | 0~255 | (8)ビット指定 |
| unsigned char | 8ビット | 0~255 | | | unsigned char | 8ビット | 0~255 | |
-| int16_t  | 16ビット | -32768~32767 | (16)ビット指定 |+| int16_t  | 16ビット | -32768~32767 | 16ビット指定 |
| short    | 16ビット | -32768~32767 | short int | | short    | 16ビット | -32768~32767 | short int |
-| uint16_t | 16ビット | 0~65535 | (16)ビット指定 |+| uint16_t | 16ビット | 0~65535 | 16ビット指定 |
| unsigned short | 16ビット | 0~65535 | | | unsigned short | 16ビット | 0~65535 | |
-| int32_t  | 32ビット | -2147483648~2147483647 | (32)ビット指定 |+| int32_t  | 32ビット | -2147483648~2147483647 | 32ビット指定 |
| long    | 32ビット | -2147483648~2147483647 | long int | | long    | 32ビット | -2147483648~2147483647 | long int |
| int      | 32ビット | -2147483648~2147483647 | | | int      | 32ビット | -2147483648~2147483647 | |
-| uint32_t | 32ビット | 0~4294967295 | (32)ビット指定 |+| uint32_t | 32ビット | 0~4294967295 | 32ビット指定 |
| unsigned long | 32ビット | 0~4294967295 | | | unsigned long | 32ビット | 0~4294967295 | |
| unsigned int  | 32ビット | 0~4294967295 | | | unsigned int  | 32ビット | 0~4294967295 | |
Line 95: Line 96:
| /= | a /= b | a = a / b | | /= | a /= b | a = a / b |
| %= | a %= b | a = a % b | | %= | a %= b | a = a % b |
-| ++ | a++(++a) | a = a + 1 | +| ++ | a++ | a = a + 1 | 
-| -- | a--(--a) | a = a - 1 |+| -- | a-- | a = a - 1 |
- 補足 - 補足
a++と++aの違いについて~ a++と++aの違いについて~
Line 174: Line 175:
****ポインタとは [#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 233:
 c = a;  // アドレスをコピーします  c = a;  // アドレスをコピーします
 c++;    // アドレスを1つ進めます  c++;    // アドレスを1つ進めます
- b = *c; // アドレスの示す内容を代入します+ b = *c; // アドレスの示す内容(E)を代入します
</pre> </pre>
}} }}
Line 402: Line 426:
各関数内にインデントを付け、階層化することで、それぞれの関数の開始位置と終了位置が分かりやすくなります。 各関数内にインデントを付け、階層化することで、それぞれの関数の開始位置と終了位置が分かりやすくなります。
-[[FDIII-HC Learning Guide]]に戻る+[[FDIII-HC Starter Kit Guide>LEARNINGGUIDE]]に戻る


トップ   差分 リロード印刷に適した表示   全ページ一覧 単語検索 最新ページの一覧   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom