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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
YUKI007BKB
記事: 6
登録日時: 3ヶ月前

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

#1

投稿記事 by YUKI007BKB » 3ヶ月前

コード:

#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;
とエラーが出てしまいました.

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

アバター
みけCAT
記事: 6214
登録日時: 8年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 3ヶ月前

YUKI007BKB さんが書きました:
3ヶ月前
このプログラムについて質問です.
ptr -> id や ptr -> height のような表現はポインタを表していますよね?
ポインタptrが指す構造体のメンバを表しています。
このプログラムの場合、ptr -> id はint型、ptr -> height はdouble型で、ポインタを表していません。
YUKI007BKB さんが書きました:
3ヶ月前
実際,

コード:

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

コード:

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

コード:

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

コード:

*(ptr->id) = 101;
とするのが正しいと思いますが,これをコンパイルしようとすると,
error: invalid type argument of unary ‘*’ (have ‘int’)
*(ptr -> id) = 101;
とエラーが出てしまいました.
前述の通り、このプログラムではptr->idはポインタではありません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

YUKI007BKB
記事: 6
登録日時: 3ヶ月前

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

#3

投稿記事 by YUKI007BKB » 3ヶ月前

早速の返信ありがとうございます.
まず,ポインタだと思っていたのは自分の勘違いでした.

コード:

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

コード:

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

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

返信

“C言語何でも質問掲示板” へ戻る