gl5_progのメモ

自分のためのメモとかまとめとか

(ideoneメモ)配列の参照

http://ideone.com/RJd1WV

    #include <stdio.h>
     
    #define COUNT 5
    typedef int(&DEF_ARRAY)[COUNT];
    class A
    {
    public:
    int m_Array[COUNT];
    /* error
    int(&)[COUNT] GetArray( void ) { return m_Array; }
    */
    A()
    {
    for( int i=0; i<int(sizeof( m_Array )/sizeof( m_Array[0] )); ++i )
    {
    m_Array[i] = i;
    }   
    }
    DEF_ARRAY GetArray( void ) { return m_Array; }
    };
     
    void ReceiveArray( int array[COUNT] )
    {
    printf( "%d / %d\n", sizeof( array[0] ), sizeof( array ) );
    for( int i=0; i<int(sizeof( array )/sizeof( array[0] )); ++i )
    {
    printf( " [%d] %d\n", i, array[i] );
    }
    }
    void ReceiveArrayRef( int(&array)[COUNT] )
    {
    printf( "%d / %d\n", sizeof( array[0] ), sizeof( array ) );
    for( int i=0; i<int(sizeof( array )/sizeof( array[0] )); ++i )
    {
    printf( " [%d] %d\n", i, array[i] );
    }
    }
     
    int main( void )
    {
    A a;
    /* error
    int array[COUNT] = a.GetArray();
    */
    int (&arrayRef)[COUNT] = a.GetArray();
    puts( "a.m_Array" ); ReceiveArray( a.m_Array );
    puts( "a.m_Array" ); ReceiveArrayRef( a.m_Array );
    puts( "arrayRef" ); ReceiveArrayRef( arrayRef );
    arrayRef[2] = 99;
    puts( "a.m_Array" ); ReceiveArrayRef( a.m_Array );
    puts( "arrayRef" ); ReceiveArrayRef( arrayRef );
    return 0;
    }

配列の参照は仮引数にしたり、戻り値にしたりできる。 戻り値にする場合、typedefは必須なわけではないけどtypedef使わないととても読みにくい書き方になるようなので、typedef使った方が良さそう。

typedef使わない書き方 -> Akihiro Notes: 関数の戻り値で配列の参照を返す(C++)