構造体へのポインタ
構造体変数を
struct Man *student;
のように宣言すると、student は Man 構造体へのポインタとなります。このとき、メンバにアクセスするには
(*student).name
のようにアクセスします、もし、
*student.name
のように記述するとどうでしょうか。* と . では、. のほうが優勢順位が高いため
*(student.name)
の意味になってしまいます。これは、間違いです。必ず「(*student).name」のようにかっこでくくります。
しかし、アロー演算子(->)を使うほうが一般的です。
student->name
と書くことができます。このほうが分かりやすいですね。構造体メンバを関数で書き換えてもらう場合、構造体へのポインタを引数として渡してやる必要があります。
構造体ポインタが指す構造体のメンバにアクセスするには、アロー演算子(->)を使う。
ソースコード
源文件
1|
2|
3|#include <stdio.h>
4|
5|
6|struct Data {
7| char name[32];
8| int age;
9| double bl;
10| double bw;
11| double bmi;
12|};
13|
14|int struct_input (struct Data *);
15|
16|int main(void)
17|{
18| struct Data MyData;
19| char format[] = "%sさん(%d歳)のプロフィール\n"
20| "身長 = %5.1fcm, 体重 = %5.1fkg, BMI = %4.1f\n";
21| char buffer[256];
22|
23| struct_input(&MyData);
24| sprintf(buffer, format, MyData.name, MyData.age,
25| MyData.bl, MyData.bw, MyData.bmi);
26| printf("%s",buffer);
27| printf("%s", MyData.name);
28| return 0;
29|}
30|
31|int struct_input(struct Data *p)
32|{
33| printf("Name---");
34| gets(p->name);
35| printf("Age---");
36| scanf("%d", &p->age);
37| printf("Height(cm)---");
38| scanf("%lf", &p->bl);
39| printf("Weight(kg)---");
40| scanf("%lf", &p->bw);
41| p->bmi = p->bw * 10000.0 / (p->bl * p->bl);
42|
43| return 0;
44|}
|
実行結果
Name---liang
Age---26
Height(cm)---177
Weight(kg)---55
liangさん(26歳)のプロフィール
身長 = 177.0cm, 体重 = 55.0kg, BMI = 17.6
「&p->age」は、演算子 & と -> では -> のほうが優先順位が高いので「&(p->age)」の意味になります。
Chapte8 @ C言語目録 @ HomeWork List @ 昭亮's Homepage
|