C言語 | 構造体宣言 | 構造体へのポインタ

構造体にもアドレスがあり、ポインタ経由でアクセスできます。

構造体メンバを間接参照する

構造体へのポインタは次のように宣言します。

struct Point *pointer = &pt;

メンバアクセス演算子を使う前にポインタを間接参照します。

int x = (*pointer).x;
#include <stdio.h>

struct Point {
  int x;
  int y;
};

int main(void) {
  struct Point pt = { 100, 200 };
  struct Point *ppt = &pt;
  printf("pt.x = %d : pt.y = %d\n", (*ppt).x, (*ppt).y);
  return 0;
}

アロー演算子を使うと短く書けます。

pointer->member

pointer->member(*pointer).member と同じ意味です。

printf("pt.x = %d : pt.y = %d\n", ppt->x, ppt->y);

構造体全体のコピーを避けるため、関数には構造体へのポインタを渡すことがよくあります。

struct Point {
  int x;
  int y;
};

void SizeToPoint(struct Point *offsetPoint, struct Point *target,
                 int width, int height) {
  target->x = offsetPoint->x + width;
  target->y = offsetPoint->y + height;
}

呼び出し元は構造体のアドレスを渡し、関数は target を通じて計算結果を書き込みます。必要であれば、戻り値を成功または失敗の通知に使えます。