2013年3月26日火曜日

構造体の要素を動的に操作する

ポインタの話。
c言語使う機会があるので調べなおして備忘録。

以下のような構造体があったとして、セルの値を動的に参照したいですよ。
struct SAMPLE_TABLE {
    char[] name;
    int cell0;
    int cell1;
    int cell2;
    int cell3;
    int cell4;
    int cell5;
}

これを下記の様なループで回すと初期化できる。
SAMPLE_TABLE  sample_table;
int* p_cell = &sample_table.cell0;
int i;
for (i = 0; i < 6; i++ ) {
    *p_cell = i;
    p_cell ++;
}

1.変数を定義するとその値はメモリのどこかに保存される。
ポインタは定義された変数の保存先のメモリ領域(アドレス)だ。
int* p_cellはアドレスを格納するための変数(ポインタ変数)を定義している。

2.変数の前に&(アンパサンド)を付けることでその変数のアドレスを取得することができる。
&sample_table.cell0ではsample_tableのcell0のアドレスを取得する。

3.ポインタ変数の前に*(アスタリスク)を付けることでそのポインタ変数に格納されたアドレスを参照する。
*p_cell = iはp_cellに格納されたアドレスが参照するメモリ領域にiを代入している。

4.一回目のループではsample_table.cell0 = 0、
二回目のループではsample_table.cell1 = 1と同じ意味だ。
c言語の変数は定義された順にアドレスに領域が確保される。
そのためcell0~cell5は連続したアドレスに保存されることとなる。
次の行のp_cell ++でアドレスの参照先を一つ進める。


...程度の理解(現状)。
間違ってたり誤解を招く表現してたら指摘ください。

byte長なんかの詳しい話は参考サイトへ
http://www5c.biglobe.ne.jp/~ecb/c/01_04.html

0 件のコメント:

コメントを投稿