「C言語/データ型と変数」の版間の差分

削除された内容 追加された内容
→‎列挙型: 列挙型を列挙体へ修正
.旻 (トーク | 投稿記録)
編集の要約なし
83 行
</pre>
 
<source lang=c>
<pre>
//例 int型の変数を宣言する。
int main(void)
89 行
int i;
}
</presource>
 
また、変数の宣言と同時に初期化することもできる。
<ref>『JISX3010:2003』p.94「6.7.8 初期化」</ref>
 
<source lang=c>
<pre>
//例 int型の変数を宣言し、0で初期化する。
int main(void)
100 行
int i=0;
}
</presource>
同じ型の変数は「,(コンマ)」で区切って一行で宣言できる。
<source lang=c>
<pre>
//例 int型の変数i, j, kを一行で宣言する。
int main(void)
108 行
int i, j, k;
}
</presource>
 
 
変数にデータを格納することを代入と呼ぶ。
代入の記述は次のようになっている。
<source lang=c>
<pre>
変数の識別子=式;
</presource>
「=」は代入演算子と呼ばれ、左辺の変数の識別子が指す変数に右辺の式の値を代入する。
数学における等号とは異なる用法であるので注意せよ。
129 ⟶ 128行目:
<ref>『JISX3010:2003』p.32「6.3.1.5 実浮動小数点型」</ref>
 
<source lang=c>
<pre>
//例 int型の変数を宣言し、0を代入する。
int main(void)
136 ⟶ 135行目:
i=0;
}
</presource>
 
変数に格納されたデータを使用することを参照と呼ぶ。
変数は、式の中で参照することができる。
参照の記述は次のようになっている。
<source lang=c>
<pre>
変数の識別子
</presource>
<source lang=c>
<pre>
//例 int型の変数を宣言し0で初期化して、1を加える(iの値を参照してそれに1を加えたものをiに代入する)。
int main(void)
151 ⟶ 150行目:
i=i+1;//++i;と書いてもよい。
}
</presource>
 
== ローカル変数とグローバル変数 ==
184 ⟶ 183行目:
</pre>
 
<source lang=c>
<pre>
//例 typedefの使用例
 
193 ⟶ 192行目:
UINT value;
}
</presource>
 
typedefを使うことで、マルチプラットホームにおいて可搬性を高めることができる。
つまり、データ型を変更したい場合、typedefの部分を変更するだけで、すべてのデータ型を変更できる。
203 ⟶ 201行目:
typedefは構造体に用いて、コードを短縮することができる。
 
<source lang=c>
<pre>
//例 typedefを用いない構造体の宣言
 
218 ⟶ 216行目:
struct sKouzoutai kouzoutai;//構造体の宣言には「struct タグ名」が必要
}
</presource>
 
上の例はtypedefを用いて、下の例のように記述することができる。
 
<source lang=c>
<pre>
//例 typedefを用いた構造体の宣言
 
237 ⟶ 235行目:
KOUZOUTAI kouzoutai;//構造体の宣言には「構造体の別名」が必要
}
</presource>
 
==== typedefをポインタに用いる ====
ポインタについては[[C言語/ポインタ]]を参照せよ。
複数のポインタを一行で宣言するとき、しばしば下の例のような誤りを犯す場合がある。
<source lang=c>
 
<pre>
//例 typedefを用いないポインタの宣言
 
250 ⟶ 247行目:
int* p1, p2;//int型のポインタであるp1と、int型の変数であるp2が宣言される。
}
</presource>
 
上の例はtypedefを用いて、下の例のように記述することができる。
 
<source lang=c>
<pre>
//例 typedefを用いたポインタの宣言
 
262 ⟶ 259行目:
PINT p1, p2;//int型のポインタであるp1とp2が宣言される。
}
</presource>
=== extern ===
<ref>『JISX3010:2003』p.23「6.2.2 識別子の結合」</ref>
281 ⟶ 278行目:
externを使うことで、複数のソースファイルで、1つの識別子を共有することができる。
 
<source lang=c>
<pre>
//例 externの使用例
 
297 ⟶ 294行目:
printf("function関数を呼び出した後のiの値は%d。\n", i);
}
</source>
 
<source lang=c>
//file2.c
int i;
305 ⟶ 303行目:
i=2;
}
</presource>
 
=== static ===
323 ⟶ 321行目:
また、ブロック有効範囲のオブジェクトにstaticを使うことで、そのブロックを含む関数が再び呼び出された時、前の値が保存されているようにする。
 
<source lang=c>
<pre>
//例 staticの誤った使用例
//※このプログラムはコンパイルエラーとなる。
348 ⟶ 346行目:
i=2;
}
</presource>
 
<source lang=c>
<pre>
//例 staticの使用例
 
368 ⟶ 366行目:
function();
}
</presource>
 
=== auto ===
377 ⟶ 375行目:
なお、autoは省略することができる。
 
<source lang=c>
<pre>
//例 autoの使用例
 
384 ⟶ 382行目:
auto int i;//「int i;」と書いても同じである。
}
</presource>
 
=== register ===
405 ⟶ 403行目:
また、用いなくともコンパイラは自動的にソースコードを最適化するため、低速になるとは限らない。
 
<source lang=c>
<pre>
//例 registerの使用例
#include <stdio.h>
416 ⟶ 414行目:
printf("1から100までの総和は%d。\n", sum);
}
</presource>
 
== 型指定子 ==
482 ⟶ 480行目:
</pre>
列挙定数の値は、列挙体の型枠の宣言で列挙定数に指定した定数となる。
 
<pre>
//例 列挙体の使用例
516 ⟶ 513行目:
プログラム中で誤って変更するのを防ぐことができる。
 
<source lang=c>
<pre>
//例 constの誤った使用例
//※このプログラムはコンパイルエラーとなる。
525 ⟶ 522行目:
++i;//iの値は変更不可能。
}
</presource>
 
=== restrict ===
537 ⟶ 534行目:
 
restrictの例として、標準ライブラリstring.hのmemcpy関数とmemmove関数が挙げられる。
<source lang=c>
<pre>
#include<string.h>
 
void *memcpy(void * restrict s1, const void * restrict s2, size_t n);
void *memmove(void *s1, const void *s2, size_t n);
</presource>
これら2つの関数は、
どちらもs2をs1にn文字コピーするが、
563 ⟶ 560行目:
<references/>
 
[[Category:C言語|てえたかたとへんすう]]