ページ 11

構造体の ptr-> id = 101; のような表記について

Posted: 2019年6月02日(日) 18:00
by YUKI007BKB

コード:

#include <stdio.h>

struct DATA{
  int id;
  double height;
};

void in_data(struct DATA *ptr);

void main(void){
  struct DATA stdata;
  in_data(&stdata);
  printf("ID=%d, height=%lf",stdata.id, stdata.height);
}

void in_data(struct DATA *ptr){
  ptr->id = 101;
  ptr->height = 165.5;
}
このプログラムについて質問です.
ptr -> id や ptr -> height のような表現はポインタを表していますよね? 実際,

コード:

printf("%p, %d", ptr->id, *(ptr->id) );
は正しく出力されますが,

コード:

printf("%d ", ptr->id );
は警告が出て,そのまま実行しても正しく出力されません.

しかし,最後の方の

コード:

ptr >id = 101;
という表現はなぜ正しいのでしょうか? ポインタならば

コード:

*(ptr->id) = 101;
とするのが正しいと思いますが,これをコンパイルしようとすると,
error: invalid type argument of unary ‘*’ (have ‘int’)
*(ptr -> id) = 101;
とエラーが出てしまいました.

どなたか教えてくださると助かります.

Re: 構造体の ptr-> id = 101; のような表記について

Posted: 2019年6月02日(日) 19:04
by みけCAT
YUKI007BKB さんが書きました:
4年前
このプログラムについて質問です.
ptr -> id や ptr -> height のような表現はポインタを表していますよね?
ポインタptrが指す構造体のメンバを表しています。
このプログラムの場合、ptr -> id はint型、ptr -> height はdouble型で、ポインタを表していません。
YUKI007BKB さんが書きました:
4年前
実際,

コード:

printf("%p, %d", ptr->id, *(ptr->id) );
は正しく出力されますが,

コード:

printf("%d ", ptr->id );
は警告が出て,そのまま実行しても正しく出力されません.
どのような警告ですか?
「正しく出力される」とはどのようなものが出力されることですか?
これらは本当にこのプログラムに関する記述ですか?
YUKI007BKB さんが書きました:
4年前
しかし,最後の方の

コード:

ptr >id = 101;
という表現はなぜ正しいのでしょうか?
ptr->id = 101;は正しいですが、ptr >id = 101;は
C言語では=演算子の左辺がlvalueではないので、正しくありません。
C++なら演算子オーバーロードにより正しくなる可能性が考えられます。
YUKI007BKB さんが書きました:
4年前
ポインタならば

コード:

*(ptr->id) = 101;
とするのが正しいと思いますが,これをコンパイルしようとすると,
error: invalid type argument of unary ‘*’ (have ‘int’)
*(ptr -> id) = 101;
とエラーが出てしまいました.
前述の通り、このプログラムではptr->idはポインタではありません。

Re: 構造体の ptr-> id = 101; のような表記について

Posted: 2019年6月02日(日) 20:00
by YUKI007BKB
早速の返信ありがとうございます.
まず,ポインタだと思っていたのは自分の勘違いでした.

コード:

printf("%p, %d", ptr->id, *(ptr->id) );
printf("%d ", ptr->id );
は実際に実行確認していたわけではなく,似たような状況のある別のプログラムで確認したに過ぎませんでした.
そして,そのプログラムでは,idのところが変数でなく配列であったためポインタを示していたということでした.

コード:

ptr ->id = 101;
は完全に打ち間違えです笑

前回,構造体のメモリの質問をさせていただいた時にもお世話になりました.
今回もどうもありがとうございました!