C/C++ 変数宣言の読み方入門

読み方のコツ

規則は単純です。この二点だけ押さえましょう:

  1. ポインタの* より 配列の[] や 関数の() の方が優先順位が高い
  2. 日本語の人は左から右へ読む。ただし () の中は後で読む
    英語の人は逆に変数名(一番内側の括弧)から結合優先順位の高い順に外へ読む

そしてそれぞれの記号が出てきたら下記のように読み替えましょう
*
 〜を指すポインタ, a pointer to 〜
[]
 〜の配列, an array of 〜
()
 〜を返す関数, a function returning 〜
 〜を引数に取り〜を返す関数, a function taking 〜 and returning 〜

具体例

  1. char* aaa;
  2. char aaa[10];
  3. char *aaa[10];
  4. char** aaa;
  5. char (*aaa)[10];
  6. char (**aaa)[10];
  7. char *(*aaa)[10];
  8. char *(*aaa[10])[10];
  9. char **1( int );
  10. char (*(*aaa[10])( int ))( int );
  11. char (*(*aaa)( int ))[10];
  12. char (*aaa)( char (*)( int ));

例1

char*	aaa;

  • char* aaa;

    char型を指すポインタ

    aaa is a pointer to char.

  • 読み方(日本語の場合):
    1. char* aaa;

      char型
    2. char* aaa;

      を指すポインタ
  • 読み方(英語の場合):
    1. char* aaa;

      aaa is
    2. char* aaa;

      a pointer to
    3. char* aaa;

      char.

例2

char	aaa[10];

  • char aaa[10];

    char型の配列

    aaa is an array of char.

  • 読み方(日本語の場合):
    1. char aaa[10];

      char型
    2. char aaa[10];

      の配列
  • 読み方(英語の場合):
    1. char aaa[10];

      aaa is
    2. char aaa[10];

      an array of
    3. char aaa[10];

      char.

例3

char	*aaa[10];

  • char *aaa[10];

    char型を指すポインタの配列

    aaa is an array of a pointer to char.
  • 読み方(日本語の場合):
    1. char *aaa[10];

      char型
    2. char *aaa[10];

      を指すポインタ
    3. char *aaa[10];

      の配列
  • 読み方(英語の場合):
    1. char *aaa[10];

      aaa is
    2. char *aaa[10];

      (* と [] では [] の方が強いので [] が先)
    3. char *aaa[10];

      an array of
    4. char *aaa[10];

      a pointer to
    5. char *aaa[10];

      char.

例4

char**	aaa;

  • char** aaa;

    char型を指すポインタを指すポインタ

    aaa is a pointer to a pointer to char.
  • 読み方(日本語の場合):
    1. char** aaa;

      char型
    2. char** aaa;

      を指すポインタ
    3. char** aaa;

      を指すポインタ
  • 読み方(英語の場合):
    1. char** aaa;

      aaa is
    2. char** aaa;

      a pointer to
    3. char** aaa;

      a pointer to
    4. char** aaa;

      char.

例5

char	(*aaa)[10];

  • char (*aaa)[10];

    char型の配列を指すポインタ

    aaa is a pointer to an array of char.
  • 読み方(日本語の場合):
    1. char (*aaa)[10];

      char型
    2. char (*aaa)[10];

      (括弧の中は後回しにするから括弧の後ろへ)
    3. char (*aaa)[10];

      の配列
    4. char (*aaa)[10];

      (括弧の中がまだ残ってるから括弧の中へ)
    5. char (*aaa)[10];

      を指すポインタ
  • 読み方(英語の場合):
    1. char (*aaa)[10];

      aaa is
    2. char (*aaa)[10];

      a pointer to
    3. char (*aaa)[10];

      (括弧の外に出る)
    4. char (*aaa)[10];

      an array of
    5. char (*aaa)[10];

      char.
  • 使用例

    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;
    }
    


例6

char	(**aaa)[10];

  • char (**aaa)[10];

    char型の配列を指すポインタを指すポインタ

    aaa is a pointer to a pointer to an array of char.
  • 読み方(日本語の場合):
    1. char (**aaa)[10];

      char型
    2. char (**aaa)[10];

      (括弧の中は後回しにするから括弧の後ろへ)
    3. char (**aaa)[10];

      の配列
    4. char (**aaa)[10];

      (括弧の中がまだ残ってるから括弧の中へ)
    5. char (**aaa)[10];

      を指すポインタ
    6. char (**aaa)[10];

      を指すポインタ
  • 読み方(英語の場合):
    1. char (**aaa)[10];

      aaa is
    2. char (**aaa)[10];

      a pointer to
    3. char (**aaa)[10];

      a pointer to
    4. char (**aaa)[10];

      (括弧の外に出る)
    5. char (**aaa)[10];

      an array of
    6. char (**aaa)[10];

      char.
  • 使用例

    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;
    }
    


例7

char	*(*aaa)[10];

  • char *(*aaa)[10];

    char型を指すポインタの配列を指すポインタ

    aaa is a pointer to an array of a pointer to char.
  • 読み方(日本語の場合):
    1. char *(*aaa)[10];

      char型
    2. char *(*aaa)[10];

      を指すポインタ
    3. char *(*aaa)[10];

      (括弧の中は後回しにするから括弧の後ろへ)
    4. char *(*aaa)[10];

      の配列
    5. char *(*aaa)[10];

      (括弧の中がまだ残ってるから括弧の中へ)
    6. char *(*aaa)[10];

      を指すポインタ
  • 読み方(英語の場合):
    1. char *(*aaa)[10];

      aaa is
    2. char *(*aaa)[10];

      a pointer to
    3. char *(*aaa)[10];

      (括弧の外に出る)
    4. char *(*aaa)[10];

      (* と [] では [] の方が強いので [] が先)
    5. char *(*aaa)[10];

      an array of
    6. char *(*aaa)[10];

      a pointer to
    7. char *(*aaa)[10];

      char.
  • 使用例

    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;
    }
    


例8

char	*(*aaa[10])[10];

  • char *(*aaa[10])[10];

    char型を指すポインタの配列を指すポインタの配列

    aaa is an array of a pointer to an array of a pointer to char.
  • 読み方(日本語の場合):
    1. char *(*aaa[10])[10];

      char型
    2. char *(*aaa[10])[10];

      を指すポインタ
    3. char *(*aaa[10])[10];

      (括弧の中は後回しにするから括弧の後ろへ)
    4. char *(*aaa[10])[10];

      の配列
    5. char *(*aaa[10])[10];

      (括弧の中がまだ残ってるから括弧の中へ)
    6. char *(*aaa[10])[10];

      を指すポインタ
    7. char *(*aaa[10])[10];

      の配列
  • 読み方(英語の場合):
    1. char *(*aaa[10])[10];

      aaa is
    2. char *(*aaa[10])[10];

      (* と [] では [] の方が強いので [] が先)
    3. char *(*aaa[10])[10];

      an array of
    4. char *(*aaa[10])[10];

      a pointer to
    5. char *(*aaa[10])[10];

      (括弧の外に出る)
    6. char *(*aaa[10])[10];

      (* と [] では [] の方が強いので [] が先)
    7. char *(*aaa[10])[10];

      an array of
    8. char *(*aaa[10])[10];

      a pointer to
    9. char *(*aaa[10])[10];

      char.
  • 使用例

    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" );
    }
    


例9

char	*((*aaa)[10])[10];

  • char *((*aaa)[10])[10];

    char型を指すポインタの配列の配列を指すポインタ

    aaa is a pointer to an array of an array of a pointer to char.
  • 読み方(日本語の場合):
    1. char *((*aaa)[10])[10];

      char型
    2. char *((*aaa)[10])[10];

      を指すポインタ
    3. char *((*aaa)[10])[10];

      (括弧の中は後回しにするから括弧の後ろへ)
    4. char *((*aaa)[10])[10];

      の配列
    5. char *((*aaa)[10])[10];

      (括弧の中がまだ残ってるから括弧の中へ)
    6. char *((*aaa)[10])[10];

      (括弧の中は後回しにするから括弧の後ろへ)
    7. char *((*aaa)[10])[10];

      の配列
    8. char *((*aaa)[10])[10];

      (括弧の中がまだ残ってるから括弧の中へ)
    9. char *((*aaa)[10])[10];

      を指すポインタ
  • 読み方(英語の場合):
    1. char *((*aaa)[10])[10];

      aaa is
    2. char *((*aaa)[10])[10];

      a pointer to
    3. char *((*aaa)[10])[10];

      (括弧の外に出る)
    4. char *((*aaa)[10])[10];

      an array of
    5. char *((*aaa)[10])[10];

      (括弧の外に出る)
    6. char *((*aaa)[10])[10];

      (* と [] では [] の方が強いので [] が先)
    7. char *(*aaa)[10])[10];

      an array of
    8. char *((*aaa)[10])[10];

      a pointer to
    9. char *((*aaa)[10])[10];

      char.
      == 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;
    


例10

char	(*aaa)( int );

  • char (*aaa)( int );

    char型を返し int を引数に取る関数を指すポインタ

    aaa is a pointer to a function taking int and returning char.
  • 読み方(日本語の場合):
    1. char (*aaa)( int );

      char型
    2. char (*aaa)( int );

      (括弧の中は後回しにするから括弧の後ろへ)
    3. char (*aaa)( int );

      を返す int を引数に取る関数
    4. char (*aaa)( int );

      (括弧の中がまだ残ってるから括弧の中へ)
    5. char (*aaa)( int );

      を指すポインタ
  • 読み方(英語の場合):
    1. char (*aaa)( int );

      aaa is
    2. char (*aaa)( int );

      a pointer to
    3. char (*aaa)( int );

      (括弧の外に出る)
    4. char (*aaa)( int );

      a function taking int and returning
    5. char (*aaa)( int );

      char.
  • 使用例

    char	aaa( int	a ){
    	return	( char )a;
    }
    char	(*bbb)( int ) = aaa;
    


例11

char*	(*aaa)( int );

  • char* (*aaa)( int );

    char型を指すポインタを返し int を引数に取る関数を指すポインタ

    aaa is a pointer to a function taking int and returning a pointer to char.
  • 読み方(日本語の場合):
    1. char* (*aaa)( int );

      char型
    2. char* (*aaa)( int );

      を指すポインタ
    3. char* (*aaa)( int );

      (括弧の中は後回しにするから括弧の後ろへ)
    4. char* (*aaa)( int );

      を返す int を引数に取る関数
    5. char* (*aaa)( int );

      (括弧の中がまだ残ってるから括弧の中へ)
    6. char* (*aaa)( int );

      を指すポインタ
  • 読み方(英語の場合):
    1. char* (*aaa)( int );

      aaa is
    2. char* (*aaa)( int );

      a pointer to
    3. char* (*aaa)( int );

      (括弧の外に出る)
    4. char* (*aaa)( int );

      (* と () では () の方が強いので () が先)
    5. char* (*aaa)( int );

      a function taking int and returning
    6. char* (*aaa)( int );

      a pointer to
    7. char* (*aaa)( int );

      char.
  • 使用例

    char*	aaa( char*	s, int	a ){
    	return	&s[a];
    }
    char*	(*bbb)( int ) = aaa;
    .
    .
    .
    char	s[] = "0123456789";
    char*	p = bbb( s, 2 );
    


例12

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.
  • 読み方(日本語の場合):
    1. char (*aaa[10])( int );

      char型
    2. char (*aaa[10])( int );

      (括弧の中は後回しにするから括弧の後ろへ)
    3. char (*aaa[10])( int );

      を返す int を引数に取る関数
    4. char (*aaa[10])( int );

      (括弧の中がまだ残ってるから括弧の中へ)
    5. char (*aaa[10])( int );

      を指すポインタ
    6. char (*aaa[10])( int );

      の配列
  • 読み方(英語の場合):
    1. char (*aaa[10])( int );

      aaa is
    2. char (*aaa[10])( int );

      (* と [] では [] の方が強いので [] が先)
    3. char (*aaa[10])( int );

      an array of
    4. char (*aaa[10])( int );

      a pointer to
    5. char (*aaa[10])( int );

      (括弧の外に出る)
    6. char (*aaa[10])( int );

      a function taking int and returning
    7. char (*aaa[10])( int );

      char.
  • 使用例

    char	aaa( int	a ){
    	return	( char )a;
    }
    char	(*bbb[])( int ) = {
    	aaa,
    };
    .
    .
    .
    char	c = bbb[0]( 'A' );
    


例13

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.
  • 読み方(日本語の場合):
    1. char (*(*aaa)( int ))( int );

      char型
    2. char (*(*aaa)( int ))( int );

      (括弧の中は後回しにするから括弧の後ろへ)
    3. char (*(*aaa)( int ))( int );

      を返す int を引数に取る関数
    4. char (*(*aaa)( int ))( int );

      (括弧の中がまだ残ってるから括弧の中へ)
    5. char (*(*aaa)( int ))( int );

      を指すポインタ
    6. char (*(*aaa)( int ))( int );

      (括弧の中は後回しにするから括弧の後ろへ)
    7. char (*(*aaa)( int ))( int );

      を返す int を引数に取る関数
    8. char (*(*aaa)( int ))( int );

      (括弧の中がまだ残ってるから括弧の中へ)
    9. char (*(*aaa)( int ))( int );

      を指すポインタ
  • 読み方(英語の場合):
    1. char (*(*aaa)( int ))( int );

      aaa is
    2. char (*(*aaa)( int ))( int );

      a pointer to
    3. char (*(*aaa)( int ))( int );

      (括弧の外に出る)
    4. char (*(*aaa)( int ))( int );

      (* と () では () の方が強いので () が先)
    5. char (*(*aaa)( int ))( int );

      a function taking int and returning
    6. char (*(*aaa)( int ))( int );

      a pointer to
    7. char (*(*aaa)( int ))( int );

      (括弧の外に出る)
    8. char (*(*aaa)( int ))( int );

      a function taking int and returning
    9. char (*(*aaa)( int ))( int );

      char.
  • 使用例

    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' );
    


例14

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.
  • 読み方(日本語の場合):
    1. char (*(*aaa[10])( int ))( int );

      char型
    2. char (*(*aaa[10])( int ))( int );

      (括弧の中は後回しにするから括弧の後ろへ)
    3. char (*(*aaa[10])( int ))( int );

      を返す int を引数に取る関数
    4. char (*(*aaa[10])( int ))( int );

      (括弧の中がまだ残ってるから括弧の中へ)
    5. char (*(*aaa[10])( int ))( int );

      を指すポインタ
    6. char (*(*aaa[10])( int ))( int );

      (括弧の中は後回しにするから括弧の後ろへ)
    7. char (*(*aaa[10])( int ))( int );

      を返す int を引数に取る関数
    8. char (*(*aaa[10])( int ))( int );

      (括弧の中がまだ残ってるから括弧の中へ)
    9. char (*(*aaa[10])( int ))( int );

      を指すポインタ
    10. char (*(*aaa[10])( int ))( int );

      の配列
  • 読み方(英語の場合):
    1. char (*(*aaa[10])( int ))( int );

      aaa is
    2. char (*(*aaa[10])( int ))( int );

      (* と [] では [] の方が強いので [] が先)
    3. char (*(*aaa[10])( int ))( int );

      an array of
    4. char (*(*aaa[10])( int ))( int );

      a pointer to
    5. char (*(*aaa[10])( int ))( int );

      (括弧の外に出る)
    6. char (*(*aaa[10])( int ))( int );

      (* と () では () の方が強いので () が先)
    7. char (*(*aaa[10])( int ))( int );

      a function taking int and returning
    8. char (*(*aaa[10])( int ))( int );

      a pointer to
    9. char (*(*aaa[10])( int ))( int );

      (括弧の外に出る)
    10. char (*(*aaa[10])( int ))( int );

      a function taking int and returning
    11. char (*(*aaa[10])( int ))( int );

      char.
  • 使用例

    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' );
    


例15

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.
  • 読み方(日本語の場合):
    1. char (*(*aaa)( int ))[10];

      char型
    2. char (*(*aaa)( int ))[10];

      (括弧の中は後回しにするから括弧の後ろへ)
    3. char (*(*aaa)( int ))[10];

      の配列
    4. char (*(*aaa)( int ))[10];

      (括弧の中がまだ残ってるから括弧の中へ)
    5. char (*(*aaa)( int ))[10];

      を指すポインタ
    6. char (*(*aaa)( int ))[10];

      (括弧の中は後回しにするから括弧の後ろへ)
    7. char (*(*aaa)( int ))[10];

      を返す int を引数に取る関数
    8. char (*(*aaa)( int ))[10];

      (括弧の中がまだ残ってるから括弧の中へ)
    9. char (*(*aaa)( int ))[10];

      を指すポインタ
  • 読み方(英語の場合):
    1. char (*(*aaa)( int ))[10];

      aaa is
    2. char (*(*aaa)( int ))[10];

      a pointer to
    3. char (*(*aaa)( int ))[10];

      (括弧の外に出る)
    4. char (*(*aaa)( int ))[10];

      (* と () では () の方が強いので () が先)
    5. char (*(*aaa)( int ))[10];

      a function taking int and returning
    6. char (*(*aaa)( int ))[10];

      a pointer to
    7. char (*(*aaa)( int ))[10];

      (括弧の外に出る)
    8. char (*(*aaa)( int ))[10];

      an array of
    9. char (*(*aaa)( int ))[10];

      char.
  • 使用例

    char	aaa[16][10];
    char	(*bbb( int	a ))[10]{
    	return	&aaa[a];
    }
    char	(*(*ccc)( int ))[10] = bbb;
    .
    .
    .
    char	(*p)[10] = ccc( 0 );
    


例16

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.
  • 読み方(日本語の場合):
    1. char (*aaa)( char (*)( int ));

      char型
    2. char (*aaa))( char (*)( int ));

      (括弧の中は後回しにするから括弧の後ろへ)
    3. char (*aaa)( char (*)( int ));

      を返し「char型を返し int を引数に取る関数を指すポインタ」を引数に取る関数
      1. char (*)( int )

        char型
      2. char (*)( int )

        (括弧の中は後回しにするから括弧の後ろへ)
      3. char (*)( int );

        を返し int を引数に取る関数
      4. char (*)( int );

        (括弧の中がまだ残ってるから括弧の中へ)
      5. char (*)( int );

        を指すポインタ
    4. char (*aaa)( char (*)( int ));

      (括弧の中がまだ残ってるから括弧の中へ)
    5. char (*aaa)( char (*)( int ));

      を指すポインタ
  • 読み方(英語の場合):
    1. char (*aaa)( char (*)( int ));

      aaa is
    2. char (*aaa)( char (*)( int ));

      a pointer to
    3. char (*aaa)( char (*)( int ));

      (括弧の外に出る)
    4. char (*aaa)( char (*)( int ));

      a function taking a pointer to a function taking int and returning char and returning
      1. char (*)( int )

        a pointer to
      2. char (*)( int )

        (括弧の外に出る)
      3. char (*)( int )

        a function taking int and returning
      4. char (*)( int )

        char
    5. char (*aaa)( char (*)( int ));

      char.
  • 使用例

    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 の読み方

  1. const の直後が * ならポインタの指す先は const
    1. char const* p1;
    2. char const* const* pp2;
    3. char const* a3;
  2. const の直後が 型名* ならポインタの指す先は const
    1. const char* p4;
    2. const char** pp5;
    3. const char* a6;
  3. const の直後が 型名 なら const型
    1. const char c7 = ...;
    2. const char a8 = {...};
  4. const の直後が変数名なら constオブジェクト
    1. const char* const p9 = ...;
    2. const char* const* const pp10 = ...;
    3. const char* const a11 = {...};

const の直後が * ならポインタの指す先は const

例1

char const* p1;

p1 は constな char を指す非const なポインタ

p1 is a non-const pointer to const char.


p1 は変更することができる

*p1 を変更することはできない

例2

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 も変更することはできない

例3

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

例4

const char* p4;

p4 は constな char を指す非const なポインタ

p4 is a non-const pointer to const char.

p4 は変更することができる

*p4 を変更することはできない

p1 と同じ

例5

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 を変更することはできない

例6

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型

例7

const char c7 = ...;

c7 は constな char

c7 is const char.

c7 を変更することはできない

例8

const char a8[] = {...};

a8 は constな char の配列

a8 is an array of const char.

a8[n] を変更することはできない

const の直後が変数名なら constオブジェクト

例9

const char* const p9 = ...;

p9 は constな char を指す const なポインタ

p9 is a const pointer to const char.

p9 を変更することはできない

*p9 も変更することはできない

例10

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 も変更することはできない

例11

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 であるという指定であるというのと同じです