構造体へのポインタも、ほかの型の場合と同じように作ることができる。
struct s_type { int i; char str[80]; } s, *p;
上の例では、s_type という名前の構造体を定義し、その変数 s とポインタ p を宣言している。このとき p に s のアドレスを代入するには、
p = &s;
とする。これもほかの型の場合と一緒だな。
ただし、構造体へのポインタから構造体のメンバにアクセスするときは、ドット演算子ではなく、アロー演算子(->)を使う。
p->i = 100;
次のプログラムは、構造体へのポインタの使い方の簡単な例だ。
#include #include struct s_type { int i; char str[80]; } s, *p; int main(void) { p = &s; s.i = 10; p->i = 20; strcpy(p->str, "I like struct."); printf("%d %d %s\n", s.i, p->i, p->str); return 0; }
s_type 構造体の変数 s とポインタ p を宣言し、s のアドレスを p に代入しているので、p は構造体 s を指していることになる。
15 行目でドット演算子を使ってメンバに代入しているけど、次の行で今度はポインタからアロー演算子を使って違う値を代入している。結果として上書きしているわけだ。
takatoh@nightschool $ ./sample_10_2a 20 20 I like struct.
期待通り、s.i と p->i は同じ値を出力している。