②構造体の初期化
構造体は初期化することが出来る。
例えば一度に全て0を入れたい場合、memset関数を使う。
#ifndef KOUZOUTAI_H #define KOUZOUTAI_H typedef struct p_kouzoutai { char *a; char *b; char *c; }POINT; typedef struct a_kouzoutai { char a[10]; char b[10]; char c[10]; }ARRAY; #endif
#include<stdio.h> #include "kouzoutai.h" main() { POINT syokika; memset(&syokika,'\0',sizeof(syokika)); printf("syokika.a=%s\tsyokika.b=%s\tsyokika.c=%s\n",syokika.a,syokika.b,syokika.c); } 結果 syokika.a=(null) syokika.b=(null) syokika.c=(null)
memset関数は
#include <string.h> void *memset(void *s, int c, size_t n);
と定義され先頭からnバイトまでをint cで埋める関数なのでコンパイラによっては0がnullで無いものもある。
よって移植性重視のプログラムではmemset関数を使うのは避けたほうがよい。
宣言時に初期化するのは感覚で分かるとおりである。
#include<stdio.h> #include<string.h> #include "kouzoutai.h" main() { POINT syokika={"name","住所","03-XXXX-XXXX"}; printf("syokika.a=%s\tsyokika.b=%s\tsyokika.c=%s\n",syokika.a,syokika.b,syokika.c); } 結果 syokika.a=name syokika.b=住所 syokika.c=03-XXXX-XXXX
②構造体自体をポインタで扱う
構造体をmallocして動的に確保したい。
こんなときも多いだろうがとりあえず書き方として
#include<stdio.h> #include<stdlib.h> #include<string.h> #include "kouzoutai.h" main() { POINT *p_memallocate; p_memallocate=malloc(sizeof(struct p_kouzoutai)); p_memallocate->a=strdup("testa"); p_memallocate->b=strdup("testb"); printf("%s\t%s\n",p_memallocate->a,p_memallocate->b); } 結果 testa testb
ここで->(アロー演算子)を使っているが別に使わなくてもよい。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include "kouzoutai.h" main() { POINT *p_memallocate; p_memallocate=malloc(sizeof(struct p_kouzoutai)); (*p_memallocate).a=strdup("testa"); (*p_memallocate).b=strdup("testb"); printf("%s\t%s\n",p_memallocate->a,p_memallocate->b); }
代入時だけ戻してみた。
こんなことも出来る。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include "kouzoutai.h" main() { POINT *p_memallocate; p_memallocate=malloc(sizeof(struct p_kouzoutai)*2); (p_memallocate+1)->a=strdup("testa"); (*p_memallocate).b=strdup("testb"); printf("%s\t%s\n",(p_memallocate+1)->a,p_memallocate->b); } 結果 testa teatb
ポインタの加算である。(mallocは二倍分取った)
*(p+1)はp[1]のようにも扱えたことより、配列のようにすることも出来る。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include "kouzoutai.h" main() { POINT *p_memallocate; p_memallocate=malloc(sizeof(struct p_kouzoutai)*3); p_memallocate[1].a=strdup("testa"); (p_memallocate+1)->b=strdup("testb"); printf("%s\t%s\n",p_memallocate[1].a,(p_memallocate+1)->b); } 結果 testa testb
ポインタ*(p+1) | 構造体(p+1)->a |
配列p[1] | 構造体p[1].a |
ポインタと配列の関係が理解していればおのずと構造体の方もイメージできるはず。
後はこれらを組み合わせた応用である。
最後に構造体同士を比較することは出来ない。