C/C++ 変数宣言の読み方入門
読み方のコツ
規則は単純です。この二点だけ押さえましょう:
- ポインタの* より 配列の[] や 関数の() の方が優先順位が高い
- 日本語の人は左から右へ読む。ただし () の中は後で読む
英語の人は逆に変数名(一番内側の括弧)から結合優先順位の高い順に外へ読む
そしてそれぞれの記号が出てきたら下記のように読み替えましょう
*
〜を指すポインタ, a pointer to 〜
[]
〜の配列, an array of 〜
()
〜を返す関数, a function returning 〜
〜を引数に取り〜を返す関数, a function taking 〜 and returning 〜
具体例
- char* aaa;
- char aaa[10];
- char *aaa[10];
- char** aaa;
- char (*aaa)[10];
- char (**aaa)[10];
- char *(*aaa)[10];
- char *(*aaa[10])[10];
- char **1( int );
- char (*(*aaa[10])( int ))( int );
- char (*(*aaa)( int ))[10];
- char (*aaa)( char (*)( int ));
char* aaa;
- char* aaa;
char型を指すポインタ
aaa is a pointer to char.
- 読み方(日本語の場合):
- char* aaa;
char型
- char* aaa;
を指すポインタ
- char* aaa;
- 読み方(英語の場合):
- char* aaa;
aaa is
- char* aaa;
a pointer to
- char* aaa;
char.
- char* aaa;
char aaa[10];
- char aaa[10];
char型の配列
aaa is an array of char.
- 読み方(日本語の場合):
- char aaa[10];
char型
- char aaa[10];
の配列
- char aaa[10];
- 読み方(英語の場合):
- char aaa[10];
aaa is
- char aaa[10];
an array of
- char aaa[10];
char.
- char aaa[10];
char *aaa[10];
- char *aaa[10];
char型を指すポインタの配列
aaa is an array of a pointer to char. - 読み方(日本語の場合):
- char *aaa[10];
char型
- char *aaa[10];
を指すポインタ
- char *aaa[10];
の配列
- char *aaa[10];
- 読み方(英語の場合):
- char *aaa[10];
aaa is
- char *aaa[10];
(* と [] では [] の方が強いので [] が先) - char *aaa[10];
an array of
- char *aaa[10];
a pointer to
- char *aaa[10];
char.
- char *aaa[10];
char** aaa;
- char** aaa;
char型を指すポインタを指すポインタ
aaa is a pointer to a pointer to char. - 読み方(日本語の場合):
- char** aaa;
char型
- char** aaa;
を指すポインタ
- char** aaa;
を指すポインタ
- char** aaa;
- 読み方(英語の場合):
- char** aaa;
aaa is
- char** aaa;
a pointer to
- char** aaa;
a pointer to
- char** aaa;
char.
- char** aaa;
char (*aaa)[10];
- char (*aaa)[10];
char型の配列を指すポインタ
aaa is a pointer to an array of char. - 読み方(日本語の場合):
- char (*aaa)[10];
char型
- char (*aaa)[10];
(括弧の中は後回しにするから括弧の後ろへ) - char (*aaa)[10];
の配列
- char (*aaa)[10];
(括弧の中がまだ残ってるから括弧の中へ) - char (*aaa)[10];
を指すポインタ
- char (*aaa)[10];
- 読み方(英語の場合):
- char (*aaa)[10];
aaa is
- char (*aaa)[10];
a pointer to
- char (*aaa)[10];
(括弧の外に出る) - char (*aaa)[10];
an array of
- char (*aaa)[10];
char.
- char (*aaa)[10];
- 使用例
char aaa[16][10]; char (*bbb)[10] = aaa; for( size_t n = 0; n < 16; ++n ){ char* b = *bbb; for( size_t m = 0; m < 10; ++m ){ b[m] = ( char )(( n << 4 ) | m ); } ++bbb; }
char (**aaa)[10];
- char (**aaa)[10];
char型の配列を指すポインタを指すポインタ
aaa is a pointer to a pointer to an array of char. - 読み方(日本語の場合):
- char (**aaa)[10];
char型
- char (**aaa)[10];
(括弧の中は後回しにするから括弧の後ろへ) - char (**aaa)[10];
の配列
- char (**aaa)[10];
(括弧の中がまだ残ってるから括弧の中へ) - char (**aaa)[10];
を指すポインタ
- char (**aaa)[10];
を指すポインタ
- char (**aaa)[10];
- 読み方(英語の場合):
- char (**aaa)[10];
aaa is
- char (**aaa)[10];
a pointer to
- char (**aaa)[10];
a pointer to
- char (**aaa)[10];
(括弧の外に出る) - char (**aaa)[10];
an array of
- char (**aaa)[10];
char.
- char (**aaa)[10];
- 使用例
char ccc[][10] = { "123456789", "123456789", "", }; char ddd[][10] = { "123456789", "", }; char (*bbb[])[10] = { ccc, ddd, NULL, }; char (**pp)[10] = bbb; while( *pp ){ debug_printf( "{\n" ); char (*p)[10] = *pp; while( **p ){ debug_printf( "\t" ); debug_printf( *p ); debug_printf( "\n" ); ++p; } debug_printf( "}\n" ); ++pp; }
char *(*aaa)[10];
- char *(*aaa)[10];
char型を指すポインタの配列を指すポインタ
aaa is a pointer to an array of a pointer to char. - 読み方(日本語の場合):
- char *(*aaa)[10];
char型
- char *(*aaa)[10];
を指すポインタ
- char *(*aaa)[10];
(括弧の中は後回しにするから括弧の後ろへ) - char *(*aaa)[10];
の配列
- char *(*aaa)[10];
(括弧の中がまだ残ってるから括弧の中へ) - char *(*aaa)[10];
を指すポインタ
- char *(*aaa)[10];
- 読み方(英語の場合):
- char *(*aaa)[10];
aaa is
- char *(*aaa)[10];
a pointer to
- char *(*aaa)[10];
(括弧の外に出る) - char *(*aaa)[10];
(* と [] では [] の方が強いので [] が先) - char *(*aaa)[10];
an array of
- char *(*aaa)[10];
a pointer to
- char *(*aaa)[10];
char.
- char *(*aaa)[10];
- 使用例
const char *bbb[][10] = { { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }, { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }, { "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九" }, { NULL }, }; const char *(*p)[10] = bbb; while( **p ){ const char **s = *p; for( int n = 0; n < 10; ++n ){ if( n ) debug_printf( "," ); debug_printf( "%s", s[n] ); } debug_printf( "\n" ); ++p; }
char *(*aaa[10])[10];
- char *(*aaa[10])[10];
char型を指すポインタの配列を指すポインタの配列
aaa is an array of a pointer to an array of a pointer to char. - 読み方(日本語の場合):
- char *(*aaa[10])[10];
char型
- char *(*aaa[10])[10];
を指すポインタ
- char *(*aaa[10])[10];
(括弧の中は後回しにするから括弧の後ろへ) - char *(*aaa[10])[10];
の配列
- char *(*aaa[10])[10];
(括弧の中がまだ残ってるから括弧の中へ) - char *(*aaa[10])[10];
を指すポインタ
- char *(*aaa[10])[10];
の配列
- char *(*aaa[10])[10];
- 読み方(英語の場合):
- char *(*aaa[10])[10];
aaa is
- char *(*aaa[10])[10];
(* と [] では [] の方が強いので [] が先) - char *(*aaa[10])[10];
an array of
- char *(*aaa[10])[10];
a pointer to
- char *(*aaa[10])[10];
(括弧の外に出る) - char *(*aaa[10])[10];
(* と [] では [] の方が強いので [] が先) - char *(*aaa[10])[10];
an array of
- char *(*aaa[10])[10];
a pointer to
- char *(*aaa[10])[10];
char.
- char *(*aaa[10])[10];
- 使用例
const char *bbb[][10] = { { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }, { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }, { "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九" }, { NULL }, }; const char *ccc[][10] = { { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }, { NULL }, }; const char *(*aaa[])[10] = { bbb, ccc, }; for( int n = 0; n < 2; ++n ){ const char *(*p)[10] = aaa[n]; while( **p ){ const char **s = *p; for( int n = 0; n < 10; ++n ){ if( n ){ debug_printf( "," ); } debug_printf( "%s", s[n] ); } debug_printf( "\n" ); ++p; } debug_printf( "\n" ); }
char *((*aaa)[10])[10];
- char *((*aaa)[10])[10];
char型を指すポインタの配列の配列を指すポインタ
aaa is a pointer to an array of an array of a pointer to char. - 読み方(日本語の場合):
- char *((*aaa)[10])[10];
char型
- char *((*aaa)[10])[10];
を指すポインタ
- char *((*aaa)[10])[10];
(括弧の中は後回しにするから括弧の後ろへ) - char *((*aaa)[10])[10];
の配列
- char *((*aaa)[10])[10];
(括弧の中がまだ残ってるから括弧の中へ) - char *((*aaa)[10])[10];
(括弧の中は後回しにするから括弧の後ろへ) - char *((*aaa)[10])[10];
の配列
- char *((*aaa)[10])[10];
(括弧の中がまだ残ってるから括弧の中へ) - char *((*aaa)[10])[10];
を指すポインタ
- char *((*aaa)[10])[10];
- 読み方(英語の場合):
- char *((*aaa)[10])[10];
aaa is
- char *((*aaa)[10])[10];
a pointer to
- char *((*aaa)[10])[10];
(括弧の外に出る) - char *((*aaa)[10])[10];
an array of
- char *((*aaa)[10])[10];
(括弧の外に出る) - char *((*aaa)[10])[10];
(* と [] では [] の方が強いので [] が先) - char *(*aaa)[10])[10];
an array of
- char *((*aaa)[10])[10];
a pointer to
- char *((*aaa)[10])[10];
char.
== char *(*aaa)[10][10];
- char *((*aaa)[10])[10];
- 使用例
char* bbb[][10][10] = { { { "0","1","2","3","4","5","6","7","8","9" }, { "1","2","3","4","5","6","7","8","9","0" }, { "2","3","4","5","6","7","8","9","0","1" }, { "3","4","5","6","7","8","9","0","1","2" }, { "4","5","6","7","8","9","0","1","2","3" }, { "5","6","7","8","9","0","1","2","3","4" }, { "6","7","8","9","0","1","2","3","4","5" }, { "7","8","9","0","1","2","3","4","5","6" }, { "8","9","0","1","2","3","4","5","6","7" }, { "9","0","1","2","3","4","5","6","7","8" }, }, { { "0","1","2","3","4","5","6","7","8","9" }, { "9","0","1","2","3","4","5","6","7","8" }, { "8","9","0","1","2","3","4","5","6","7" }, { "7","8","9","0","1","2","3","4","5","6" }, { "6","7","8","9","0","1","2","3","4","5" }, { "5","6","7","8","9","0","1","2","3","4" }, { "4","5","6","7","8","9","0","1","2","3" }, { "3","4","5","6","7","8","9","0","1","2" }, { "2","3","4","5","6","7","8","9","0","1" }, { "1","2","3","4","5","6","7","8","9","0" }, { "0","1","2","3","4","5","6","7","8","9" }, }, }; char *(*aaa)[10][10] = bbb;
char (*aaa)( int );
- char (*aaa)( int );
char型を返し int を引数に取る関数を指すポインタ
aaa is a pointer to a function taking int and returning char. - 読み方(日本語の場合):
- char (*aaa)( int );
char型
- char (*aaa)( int );
(括弧の中は後回しにするから括弧の後ろへ) - char (*aaa)( int );
を返す int を引数に取る関数
- char (*aaa)( int );
(括弧の中がまだ残ってるから括弧の中へ) - char (*aaa)( int );
を指すポインタ
- char (*aaa)( int );
- 読み方(英語の場合):
- char (*aaa)( int );
aaa is
- char (*aaa)( int );
a pointer to
- char (*aaa)( int );
(括弧の外に出る) - char (*aaa)( int );
a function taking int and returning
- char (*aaa)( int );
char.
- char (*aaa)( int );
- 使用例
char aaa( int a ){ return ( char )a; } char (*bbb)( int ) = aaa;
char* (*aaa)( int );
- char* (*aaa)( int );
char型を指すポインタを返し int を引数に取る関数を指すポインタ
aaa is a pointer to a function taking int and returning a pointer to char. - 読み方(日本語の場合):
- char* (*aaa)( int );
char型
- char* (*aaa)( int );
を指すポインタ
- char* (*aaa)( int );
(括弧の中は後回しにするから括弧の後ろへ) - char* (*aaa)( int );
を返す int を引数に取る関数
- char* (*aaa)( int );
(括弧の中がまだ残ってるから括弧の中へ) - char* (*aaa)( int );
を指すポインタ
- char* (*aaa)( int );
- 読み方(英語の場合):
- char* (*aaa)( int );
aaa is
- char* (*aaa)( int );
a pointer to
- char* (*aaa)( int );
(括弧の外に出る) - char* (*aaa)( int );
(* と () では () の方が強いので () が先) - char* (*aaa)( int );
a function taking int and returning
- char* (*aaa)( int );
a pointer to
- char* (*aaa)( int );
char.
- char* (*aaa)( int );
- 使用例
char* aaa( char* s, int a ){ return &s[a]; } char* (*bbb)( int ) = aaa; . . . char s[] = "0123456789"; char* p = bbb( s, 2 );
char (*aaa[10])( int );
- char (*aaa[10])( int );
char型を返し int を引数に取る関数を指すポインタの配列
つまりこれは関数ポインタの配列。その関数は int を引数に取り char を返す
aaa is an array of a pointer to a function taking int and returning char. - 読み方(日本語の場合):
- char (*aaa[10])( int );
char型
- char (*aaa[10])( int );
(括弧の中は後回しにするから括弧の後ろへ) - char (*aaa[10])( int );
を返す int を引数に取る関数
- char (*aaa[10])( int );
(括弧の中がまだ残ってるから括弧の中へ) - char (*aaa[10])( int );
を指すポインタ
- char (*aaa[10])( int );
の配列
- char (*aaa[10])( int );
- 読み方(英語の場合):
- char (*aaa[10])( int );
aaa is
- char (*aaa[10])( int );
(* と [] では [] の方が強いので [] が先) - char (*aaa[10])( int );
an array of
- char (*aaa[10])( int );
a pointer to
- char (*aaa[10])( int );
(括弧の外に出る) - char (*aaa[10])( int );
a function taking int and returning
- char (*aaa[10])( int );
char.
- char (*aaa[10])( int );
- 使用例
char aaa( int a ){ return ( char )a; } char (*bbb[])( int ) = { aaa, }; . . . char c = bbb[0]( 'A' );
char (*(*aaa)( int ))( int );
- char (*(*aaa)( int ))( int );
char型を返し int を引数に取る関数を指すポインタを返し int を引数に取る関数を指すポインタ
つまりこれは関数ポインタ。その関数は int を引数に取り関数のポインタを返す。さらにその関数は int を引数に取り char を返す
aaa is a pointer to a function taking int and returning a pointer to a function taking int and returning char. - 読み方(日本語の場合):
- char (*(*aaa)( int ))( int );
char型
- char (*(*aaa)( int ))( int );
(括弧の中は後回しにするから括弧の後ろへ) - char (*(*aaa)( int ))( int );
を返す int を引数に取る関数
- char (*(*aaa)( int ))( int );
(括弧の中がまだ残ってるから括弧の中へ) - char (*(*aaa)( int ))( int );
を指すポインタ
- char (*(*aaa)( int ))( int );
(括弧の中は後回しにするから括弧の後ろへ) - char (*(*aaa)( int ))( int );
を返す int を引数に取る関数
- char (*(*aaa)( int ))( int );
(括弧の中がまだ残ってるから括弧の中へ) - char (*(*aaa)( int ))( int );
を指すポインタ
- char (*(*aaa)( int ))( int );
- 読み方(英語の場合):
- char (*(*aaa)( int ))( int );
aaa is
- char (*(*aaa)( int ))( int );
a pointer to
- char (*(*aaa)( int ))( int );
(括弧の外に出る) - char (*(*aaa)( int ))( int );
(* と () では () の方が強いので () が先) - char (*(*aaa)( int ))( int );
a function taking int and returning
- char (*(*aaa)( int ))( int );
a pointer to
- char (*(*aaa)( int ))( int );
(括弧の外に出る) - char (*(*aaa)( int ))( int );
a function taking int and returning
- char (*(*aaa)( int ))( int );
char.
- char (*(*aaa)( int ))( int );
- 使用例
char aaa( int a ){ return ( char )a; } char (*bbb[])( int ) = { aaa, }; char (*ccc( int c ))( int ){ return bbb[c]; } char (*(*ddd)( int ))( int ) = ccc; . . . char (*p)( int ) = ddd( 0 ); char c = p( 'A' );
char (*(*aaa[10])( int ))( int );
- char (*(*aaa[10])( int ))( int );
char型を返し int を引数に取る関数を指すポインタを返し int を引数に取る関数を指すポインタの配列
つまりこれは関数ポインタの配列。その関数は int を引数に取り関数のポインタを返す。さらにその関数は int を引数に取り char を返す
aaa is an array of a pointer to a function taking int and returning a pointer to a function taking int and returning char. - 読み方(日本語の場合):
- char (*(*aaa[10])( int ))( int );
char型
- char (*(*aaa[10])( int ))( int );
(括弧の中は後回しにするから括弧の後ろへ) - char (*(*aaa[10])( int ))( int );
を返す int を引数に取る関数
- char (*(*aaa[10])( int ))( int );
(括弧の中がまだ残ってるから括弧の中へ) - char (*(*aaa[10])( int ))( int );
を指すポインタ
- char (*(*aaa[10])( int ))( int );
(括弧の中は後回しにするから括弧の後ろへ) - char (*(*aaa[10])( int ))( int );
を返す int を引数に取る関数
- char (*(*aaa[10])( int ))( int );
(括弧の中がまだ残ってるから括弧の中へ) - char (*(*aaa[10])( int ))( int );
を指すポインタ
- char (*(*aaa[10])( int ))( int );
の配列
- char (*(*aaa[10])( int ))( int );
- 読み方(英語の場合):
- char (*(*aaa[10])( int ))( int );
aaa is
- char (*(*aaa[10])( int ))( int );
(* と [] では [] の方が強いので [] が先) - char (*(*aaa[10])( int ))( int );
an array of
- char (*(*aaa[10])( int ))( int );
a pointer to
- char (*(*aaa[10])( int ))( int );
(括弧の外に出る) - char (*(*aaa[10])( int ))( int );
(* と () では () の方が強いので () が先) - char (*(*aaa[10])( int ))( int );
a function taking int and returning
- char (*(*aaa[10])( int ))( int );
a pointer to
- char (*(*aaa[10])( int ))( int );
(括弧の外に出る) - char (*(*aaa[10])( int ))( int );
a function taking int and returning
- char (*(*aaa[10])( int ))( int );
char.
- char (*(*aaa[10])( int ))( int );
- 使用例
char aaa( int a ){ return ( char )a; } char (*bbb[])( int ) = { aaa, }; char (*ccc( int c ))( int ){ return bbb[c]; } char (*(*eee[])( int ))( int ) = { ccc, }; . . . char (*(*p1)( int ))( int ) = eee[0]; char (*p2)( int ) = p1( 0 ); char c = p2( 'A' );
char (*(*aaa)( int ))[10];
- char (*(*aaa)( int ))[10];
char型の配列へのポインタを返し int を引数に取る関数を指すポインタ
つまりこれは関数のポインタ。その関数は int を引数に取りポインタを返す。そのポインタは char型の配列を指す
aaa is a pointer to a function taking int and returning a pointer to an array of char. - 読み方(日本語の場合):
- char (*(*aaa)( int ))[10];
char型
- char (*(*aaa)( int ))[10];
(括弧の中は後回しにするから括弧の後ろへ) - char (*(*aaa)( int ))[10];
の配列
- char (*(*aaa)( int ))[10];
(括弧の中がまだ残ってるから括弧の中へ) - char (*(*aaa)( int ))[10];
を指すポインタ
- char (*(*aaa)( int ))[10];
(括弧の中は後回しにするから括弧の後ろへ) - char (*(*aaa)( int ))[10];
を返す int を引数に取る関数
- char (*(*aaa)( int ))[10];
(括弧の中がまだ残ってるから括弧の中へ) - char (*(*aaa)( int ))[10];
を指すポインタ
- char (*(*aaa)( int ))[10];
- 読み方(英語の場合):
- char (*(*aaa)( int ))[10];
aaa is
- char (*(*aaa)( int ))[10];
a pointer to
- char (*(*aaa)( int ))[10];
(括弧の外に出る) - char (*(*aaa)( int ))[10];
(* と () では () の方が強いので () が先) - char (*(*aaa)( int ))[10];
a function taking int and returning
- char (*(*aaa)( int ))[10];
a pointer to
- char (*(*aaa)( int ))[10];
(括弧の外に出る) - char (*(*aaa)( int ))[10];
an array of
- char (*(*aaa)( int ))[10];
char.
- char (*(*aaa)( int ))[10];
- 使用例
char aaa[16][10]; char (*bbb( int a ))[10]{ return &aaa[a]; } char (*(*ccc)( int ))[10] = bbb; . . . char (*p)[10] = ccc( 0 );
char (*aaa)( char (*)( int ));
- char (*aaa)( char (*)( int ));
char型を返し、char型を返し int を引数に取る関数を指すポインタ、を引数にとる関数のポインタ
つまりこれは関数のポインタ。その関数は関数のポインタを引数に取り char を返す。その関数は int を引数に取り char型を返す
aaa is a pointer to a function taking a pointer to a function taking int and returning char and returning char. - 読み方(日本語の場合):
- char (*aaa)( char (*)( int ));
char型
- char (*aaa))( char (*)( int ));
(括弧の中は後回しにするから括弧の後ろへ) - char (*aaa)( char (*)( int ));
を返し「char型を返し int を引数に取る関数を指すポインタ」を引数に取る関数
- char (*)( int )
char型
- char (*)( int )
(括弧の中は後回しにするから括弧の後ろへ) - char (*)( int );
を返し int を引数に取る関数
- char (*)( int );
(括弧の中がまだ残ってるから括弧の中へ) - char (*)( int );
を指すポインタ
- char (*)( int )
- char (*aaa)( char (*)( int ));
(括弧の中がまだ残ってるから括弧の中へ) - char (*aaa)( char (*)( int ));
を指すポインタ
- char (*aaa)( char (*)( int ));
- 読み方(英語の場合):
- char (*aaa)( char (*)( int ));
aaa is
- char (*aaa)( char (*)( int ));
a pointer to
- char (*aaa)( char (*)( int ));
(括弧の外に出る) - char (*aaa)( char (*)( int ));
a function taking a pointer to a function taking int and returning char and returning
- char (*)( int )
a pointer to
- char (*)( int )
(括弧の外に出る) - char (*)( int )
a function taking int and returning
- char (*)( int )
char
- char (*)( int )
- char (*aaa)( char (*)( int ));
char.
- char (*aaa)( char (*)( int ));
- 使用例
char aaa[16]; char bbb( int a ){ return aaa[a]; } char ccc( char (*a)( int ), int b ){ return a( b ); } char ddd = ccc( bbb, 10 );
const の読み方
- const の直後が * ならポインタの指す先は const
- const の直後が 型名* ならポインタの指す先は const
- const の直後が 型名 なら const型
- const の直後が変数名なら constオブジェクト
const の直後が * ならポインタの指す先は const
char const* p1;
p1 は constな char を指す非const なポインタ
p1 is a non-const pointer to const char.
p1 は変更することができる
*p1 を変更することはできない
char const* const* pp2;
pp2 は constな char を指す const なポインタを指す非const なポインタ
pp2 is a non-const pointer to a const pointer to const char.
pp2 は変更することができる
*pp2 を変更することはできない
**pp2 も変更することはできない
char const* a3[];
a3 は constな char を指す非const なポインタの配列
a3 is an array of a non-const pointer to const char.
a3[n] は変更することができる
*a3[n] を変更することはできない
const の直後が 型名* ならポインタの指す先は const
const char* p4;
p4 は constな char を指す非const なポインタ
p4 is a non-const pointer to const char.
p4 は変更することができる
*p4 を変更することはできない
p1 と同じ
const char** pp5;
pp5 は constな char を指す非const なポインタを指す非const なポインタ
pp5 is a non-const pointer to a non-const pointer to const char.
pp5 は変更することができる
*pp5 も変更することはできる
**pp5 を変更することはできない
const char* a6[];
a6 は constな char を指す非const なポインタの配列
a6 is an array of a non-const pointer to const char.
a6[n] は変更することができる
*a6[n] を変更することはできない
a3 と同じ
const の直後が 型名 なら const型
const char c7 = ...;
c7 は constな char
c7 is const char.
c7 を変更することはできない
const char a8[] = {...};
a8 は constな char の配列
a8 is an array of const char.
a8[n] を変更することはできない
const の直後が変数名なら constオブジェクト
const char* const p9 = ...;
p9 は constな char を指す const なポインタ
p9 is a const pointer to const char.
p9 を変更することはできない
*p9 も変更することはできない
const char* const* const pp10 = ...;
pp10 は constな char を指す const なポインタを指す const なポインタ
pp10 is a const pointer to a const pointer to const char.
pp10 を変更することはできない
*pp10 も変更することはできない
**pp10 も変更することはできない
const char* const a11[] = {...};
a11 は constな char を指す const なポインタの配列
a11 is an array of a const pointer to const char.
a11[n] を変更することはできない
*a11[n] も変更することはできない
const があってもなくても配列は常に〜の配列(an array of 〜)であって constな配列(a const array of 〜)だったり非constな配列(a non-const array of 〜)だったりしないのは、元々配列は移動できたりしないからです
配列に対する const は配列の要素が const であるという指定です
ポインタに対する const がポインタの指す先が const であるという指定であるというのと同じです