C/C++の変数と配列

沖林正紀
2008-03-11 08:00:00
  • このエントリーをはてなブックマークに追加

配列とは

 配列(はいれつ)とは、同じデータ型の値を複数持つことが可能な変数のことで、これまでa[14]などと記述していたものがそれである。つまりchar a[14]とは、char型の値を14個持つことができるaという名前の配列ということになる。

 配列に収められているそれぞれの値を要素(ようそ)といい、a[10]で宣言されている配列はa[0]からa[9]までの要素を保持することができる。このとき[0]や[9]の部分を添え字(suffix)という。

定数とその記述

 定数(ていすう)とは、1、2といった数値や、”Hello!”のような文字列など、定まった値を持つデータをいう。これを記述するにも、実はきまりがある。その決まりには、文字に関するものと数値に関するものとがある。ここからはそれらを紹介したい。

数値の定数

 数値の定数は、結果として同じ数を表すにしても、10進数、16進数、8進数による記述が可能だ。このきまりはPHPなど他のプログラム言語でも共通している。

  • 10進数 100
  • 16進数 0x64 (先頭に0xをつける)
  • 8進数 0144 (先頭に0をつける)

文字に関する定数

 C/C++で扱うことができる文字に関する定数には、文字定数と文字列がある。文字定数は、記述の上では文字だが、実際には文字コードという数値を表しており、一般にはchar型で表される。これは両端を''(一重引用符)で囲む。文字列は、文字定数が複数連なった集合でリテラル(literal)とも呼ばれる。こちらは両端を""(二重引用符)で囲む。"123"のように、数値を""で囲んだものも文字列として扱われる。

  • 文字定数の例 - 'a', '\n' など (書式は%c)
  • 文字列の例 - "Hello!", "123" など

 文字定数は通常は1文字で表されるが、制御文字と呼ばれる一部の文字コードは、\を用いたエスケープ列で記述する。

エスケープ列の例
制御文字\t(水平タブ、ASCIIコード9), \n(改行、ASCIIコード10), \r(復帰、ASCIIコード13) など
\自身\\
引用符\',\"
8進数で表す文字定数\141 など
16進数で表す文字定数\x61 など
ヌル(NUL)文字\0

文字列と配列との関係

 これまで述べてきたことから、 char a[14] = "Hello, World!"; は、char型の配列に文字列を代入していることを表すのがおわかりだろうか。しかも[14]では代入される文字数よりも配列の要素が1つ多い。なぜだろうか。

 それは、文字列の末尾には必ず'\0'が付属することになっているからだ。つまり"Hello, World!"は、'H'、'e'……'d'、'!'、'\0'という文字定数の集合で表されているということだ。

 次回は、配列についてもう少し説明を加えたい。

  • コメント(2件)
#1 chaos   2008-03-29 23:35:04
代入と初期化は、ちがうものだとおもうのですが...
#2 Jitta   2008-03-30 22:24:38
「ここでchar a[14]は、char型の半角13文字分のデータ(文字列)を保持するための変数の名前をaとする、という意味だ。」
違います。
まず、安易に“半角”という言葉を使わないでください。Javaをメインでされている人なら、UNIXやLinuxの環境もさわっていらっしゃると思います。EUC_JPの環境で、いわゆる“半角カタカナ”は、何バイトですか?EUC_JP環境でこのコードを実行したときに、半角カタカナが13文字入りますか?
また、charは文字であって、文字列ではありません。「char a[14];」は、1バイト文字14個分の配列です。
Windows、VC++が前提だとおっしゃるのなら、WCHARでもいいはずです。

細かいことを言うと、NULLも1文字と数え、14文字(バイト)分の領域があります。
また、取り扱いには注意が必要ですが、strn*で文字数を指定して格納する場合に、終端子を含まずに14バイトいっぱい使うこともできます。
「char a[14];」とした場合、この中に何が入っているかは予測できません。ここに strncpy などで13バイト分のデータをコピーした場合、a[13]にNULLが入っていなければ、どうなりますか?
たまたま問題なく動くコードがかけているだけです。
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]