C-style array。 C言語スタイルの配列。
type array-name[length]; // 要素は未定義
type array-name[length] = { initial-values… };
type array-name[] = { initial-values… };- サイズに対する、初期化リスト(
{})の不足分は0で初期化される - 集成体である
const/ constexpr な配列として宣言できる- 不変な左辺値であり、要素それぞれは変更できるが、変数全体に対しては代入できない
配列(C言語)の長さは、コンパイル時評価できる式でなければならない。 添え字式には整数型を使えるが、範囲外アクセスは未定義動作である。
sizeof演算子で配列全体のバイトサイズを知ることができる。
C++17では、配列の長さをstd::size()(符号なし)で取得できる。
C++20では、std::ssize()(符号あり)も利用できる。
C++17以前では、配列全体のバイトサイズを要素の型のサイズで割ることで調べられる。
Array decay
配列(C言語)が式の中で使われるとき、暗黙的にその配列の先頭要素を指すポインタ(C++)に変換されて扱われる。 以下の例外では発生しない:
- sizeof演算子、typeid演算子の引数にする
- 配列のアドレスをアドレス演算子で取得するとき
- 参照渡し
したがって、関数引数では配列(C言語)はポインタ(C++)として扱われる。
このため、引数の宣言ではポインタ型だけでなく
T[]の形でも書ける。
ポインタの元の配列の長さを知る
配列をポインタで受け取ると、長さの情報を失うため、そのポインタの配列の長さを知るには工夫が必要になる。
- 引数で渡すときに、長さも渡してもらう
- 配列の末尾に任意の終端を表す値を設定し、それを前提に処理する
文字列(C言語)は、2.の方法を用いていることになる。
多次元配列
int arr[3][4] {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 }};見た目通りに扱うと、直交座標系と添字は、arr[y][x]のように対応していることが読み取れる。