前回では、構造体の定義についてみてきた。
C言語の基礎「構造体(2)」
今回は、構造体を活用してみよう。
Person型の値を仮引数pで受け取り、そのメンバの値を出力する関数を考えてみよう。
void print_info(Person p)
{
printf("名前:%s,年齢:%d\n",p.name,p.age);
}
これでPerson型の値を関数で受けることができる、ハズであるが、
例えば、次のような関数では、上手く動作しない。
void birthday(Person p)
{
p.age++;
}
ここで受け取る仮引数pの値は、実引数のコピーなので、関数の中でいくら値を増やしても、呼び出し元に影響を与えないのである。
そこで、ポインタを受け渡しするように変更してみよう。
void birhday(Person *p)
{
(*p).age++;
}
これで、呼び出し元で宣言したPerson型の変数の値が変わる。
さっそくプログラムコードで確認してみよう。
#include <stdio.h>
typedef struct Person
{
char name[16];
int age;
} Person;
void print_info(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
![C言語 新版 ゼロからはじめるプログラミング](https://i0.wp.com/my-studies.org/wp-content/uploads/2023/11/9f4280396dbee216542ab9e93115e4e2.jpg?resize=800%2C1011&ssl=1)
![スッキリわかるC言語入門 第2版](https://i0.wp.com/my-studies.org/wp-content/uploads/2023/11/044a17f8573f7d630b8f06c676a0bc0c.jpg?resize=722%2C1024&ssl=1)
コメント