C++_配列 メモ 02

ポインタが知りたいが復習がてら。
素数の取得 → 配列とポインタ

 

素数の取得

sizeof で求まる。

p:配列の変数。1 byte = 8bit 。1 bit は 二者択一。0 or 1 。

sizeof(p):配列全体のバイト数。
sizeof(*p):1 要素のバイト数。
sizeof(p) / sizeof(*p):素数が求められる。

ex ) int は 4 バイト

    int p[ ] = { 1,2,3,4,5 };
    int s1 = sizeof( p ); // 20
    int s2 = sizeof( *p ); // 4
    int s3 = sizeof( p ) / sizeof( *p ); // 5

 

関数の引数に渡される配列は、ポインタである為 ↑ 方法は適用できない。

    int main()
    {
        int p[ ] = { 1,2,3,4,5 };
        Foo(p); // p は配列の先頭要素へのポインタ
    }
   
    void Foo( int p[ ] ) // p はポインタ
    {
        int s1 = sizeof( p ); // 4 (int*のバイト数)
        int s2 = sizeof( *p ); // 4
        int s3 = sizeof( p ) / sizeof( *p ); // 1
    }

 

配列とポインタ

配列の名前は、その配列の先頭要素へのポインタ

    // p1 p2 は同一のアドレス
    int* p1 = a;
    int* p2 = &a[0];

 

配列の要素はアドレス順に配置されるため、
ポインタを 1 つ進めた位置の値は、[1] の位置の値と同一。

    int x1 = *(a + 1); // * は間接演算子。* + ポインタ でアドレスに格納されている値を取り出せる
    int x2 = a[1];

 

配列への各アクセス ( ※ 別個 )

    int p[ ] = { 1, 2, 3 };

    // int(*)[3]
    &p  // 配列全体を指すポインタ

    // 型 int*
    p  // 要素p[0] を指すポインタ
    *&p  // 同上
    p + 1 // 要素p[1] を指すポインタ
    p + 2 // 要素p[2] を指すポインタ

    // int
    *p  //要素p[0] の値
    p[0] // 同上
    *(p+1) // 要素p[1] の値
    p[1] // 同上

配列を示すポインタは、ウォッチ ウィンドウでデバッグできる。
※ memo--> * ( & a ) と *&a は別。

 

 

こちらから。
https://so-zou.jp/software/tech/programming/cpp/grammar/pointer/array.htm

以上。

Memo
・配列のコピー:memcpy( )・std::copy( )
・型キャスト:static_cast<変換先の型>()
・変数名:foo bar baz