C言語(しーげんご)は、1972年にAT&Tベル研究所のデニス・リッチー (Dennis M. Ritchie) が主体となって作ったプログラミング言語である。
英語圏では単に C と呼称されており、日本でも文書や文脈によっては同様に C と呼称される。
UNIXの移植性を高めるために開発された経緯から、オペレーティングシステムカーネル向けの低レベルな記述ができることを特徴としている。
Cは手続き型言語であり、コンパイラ言語として設計された。
Cは、自由度、実行速度、コンパイル速度などを追求したが、代わりにコンパイル後のコードの安全性を犠牲にもしているので、コンピュータ寄りの言語仕様になっている。
アマチュアからプロのエンジニアまで、非常にプログラマ人口が多い。
Cは正負の両面含めてコンピュータの世界に大きな影響を及ぼしているが、最大の原因はそのプログラマ人口の多さであると言われている。
パソコンはもちろんのこと、組込み用マイコンから大型コンピュータまで、Cを使用できるプラットホームは多様である。
また、仕様規格・派生言語も多い。
採用されているソフトウェア分野が広い。あらゆる分野に対してある程度の言語適性があり、現実的な選択肢としてよく用いられる。
発祥元であるUNIXの場合、大抵のことがスクリプト言語・マクロプロセッサやフィルタやそれらの組み合わせで処理できるため、うまく分野の棲み分けができていた面があったのだが、幅広い領域に移植された結果、適切でない分野にCが使われている場面もある。
低水準な記述が出来る高級言語とも、高級言語の顔をした低級言語とも言われる。
また、コーディング上の“自由度”が非常に高い。
そのため良くも悪くも“何でも出来てしまう”パワフルさは多くのプログラマの支持を集める一方で、セキュリティー脆弱性や潜んだバグによる想定外の動作、コンパイラによる最適化の難しさ(そのためCはコンパイラ言語として決して高速ではない)といった欠点の原因ともなっている。
文字列にはchar型の配列やポインタを利用する。
言語仕様上に特別な扱いはないが、ナル文字(ヌル文字、'\0')を終端とする文字列表現を使い、その操作をする標準ライブラリ関数が提供されている。これは実質的にメモリ領域のポインタアクセスそのもので、バッファオーバーランの元凶の1つとなっている。
後継言語では文字列処理が特に強化されている場合が多い。
自動変数(静的でないローカル変数)は変数の中でも最も頻繁に用いられる。初期化しない変数の初期値は不定である。
変数宣言・初期化の仕様による制限から、変数宣言の時点で初期化せず後で代入することで初期化に代えることが日常的で、誤って不定の値の変数を読み出すバグを作り込みやすい。
なお自動変数の自動とは変数の領域の確保と開放が自動であるという意味であり、自動的に初期化されるという意味ではない。