前回では、「birthday関数」の例で、構造体のポインタを受け渡しするようにすると、関数を呼び出したときに構造体のメンバをコピーする処理が発生しないことをみてきた。
この例では、値を変更する処理で使ったのだが、値を変更しない処理でも、効率がよいプログラムにすために構造体の受け渡しにポインタを使うことがある。というのも、構造体のメンバの数やサイズが大きいほど、関数呼び出し時に、「構造体の中身をコピーする」処理に大きな負荷がかかるのである。
そこで先回使った「print_info関数」もポインタを受け取るように変更してみよう。
void print_info(Person *p)
{
printf("名前:%s,年齢:%d\n",(*)p.name,(*)p.age);
}
このように変更すると、print_info関数が呼び出されるときに、「Person型の構造体の中身をコピーする」処理が行われない。
ただ、この場合、構造体のメンバ変数の値を変更することを目的としているわけではない。そこで、「const修飾子」を引数の型名の前につけることで、「この関数は値の構造体のメンバの値を変更しない」ということを、明示的に伝えるようにする。
void print_info(const Person *p)
{
命令文
}
なお、const修飾子を使うことで、関数の中で、引数で受け取った構造体のメンバの値を変更できなくなる。
また、構造体へのポインタに対しては、アロー演算子(ー>)を使ってメンバにアクセスできる。
アロー演算子を使うと、
(*)p.name
を、
p->name
とできる。
それでは、これまでの内容をプログラムコードで確認してみよう。
#include <stdio.h>
typedef struct Person
{
char name[16];
int age;
} Person;
void print_info(const Person *p)
{
printf("名前:%s,年齢:%d\n",p->name,p->age);
}
void birthday(Person *p)
{
p->age++;
}
int main(void)
{
Person p = { "ISONOKAMI TAO",17 };
print_info(&p);
birthday(&p);
print_info(&p);
}
実行結果
名前:ISONOKAMI TAO,年齢:17
名前:ISONOKAMI TAO,年齢:18
コメント