構造体へのポインタ


構造体変数を

struct Man *student;

のように宣言すると、student は Man 構造体へのポインタとなります。このとき、メンバにアクセスするには

(*student).name

のようにアクセスします、もし、

*student.name

のように記述するとどうでしょうか。* と . では、. のほうが優勢順位が高いため

*(student.name)

の意味になってしまいます。これは、間違いです。必ず「(*student).name」のようにかっこでくくります。

しかし、アロー演算子(->)を使うほうが一般的です。

student->name

と書くことができます。このほうが分かりやすいですね。構造体メンバを関数で書き換えてもらう場合、構造体へのポインタを引数として渡してやる必要があります。

構造体ポインタが指す構造体のメンバにアクセスするには、アロー演算子(->)を使う。

ソースコード

源文件
  1|/* struct03.c */
  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