アドレスと配列


Cテストコード

 前回はポインタ変数を引数として使う方法について記載しました(前回の記事)。今回はポインタ変数と配列の関係について解説します。これを知らなくてもプログラムは書けますがマスターすればプログラミングのスキルは必ず上がります。下記テストプログラムで配列のアドレス値を出力して確認していきます。まずはC言語で試してみます。※アドレスは10進数で出力します。

#include <stdio.h>
const int MAX=10;  //配列最大値

int main()
{
    int arr[MAX];

    //arrのアドレスを表示
    printf("arr's add=%d\n",arr);
    printf("arr[0]'s add=%d\n",&arr[0]);

    //arr[1]のアドレスを表示
    printf("arr+1's add=%d\n",arr+1);
    printf("arr[0]+1's add=%d\n",&arr[0]+1);
    printf("arr[1]'s add=%d\n",&arr[1]);
    
    return 0;
}

 配列の添字を抜いた変数名は先頭アドレスを持っています。つまりarrayと&array[0]は同じアドレスを持っていてイコールとなります。&がついたアドレスを示す変数&arrayに1をプラスするとアドレスは4増えます。これはint型の変数が4バイト持っていてアドレスを1つ移動したことを意味します。つまり配列で言うとarray[0]からarray[1]になったことと同じです。

VBAテストコード

VBAは下記の様に書きます。

'VBA
Option Explicit
Const MAX As Integer = 99

Sub arrTest()
    Dim arr(MAX) As Integer
    
    'arr(0)のアドレス
    Debug.Print "arr(0)'s add="; CStr(VarPtr(arr(0)))
    
    'arr(1)のアドレス
    Debug.Print "arr(1)'s add="; CStr(VarPtr(arr(1)))
    
    'arr(0)+1でarr(1)のアドレスにならない
    Debug.Print "arr(0)+1's add="; CStr(VarPtr(arr(0) + 1))
End Sub

 VBAはC言語の様に配列の変数名だけでアドレスを表現することはできません。なのでC言語の&に相当するVarPtr関数を使い、添字をしっかり指定してアドレスを表示します。VBAのInteger型は2バイトなので配列が1つ移動するとアドレスが2プラスされます。そして注意点ですがarr(0)のアドレスに1プラスしてもarr(1)のアドレスにはならないので注意してください。C言語とVBAでは表現の仕方に違いはありますが考え方は同じです。
 次回は配列を引数として扱う方法について解説します。


コメントを残す