🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

structure

このタグは、プログラム言語におけるデータ型structure(構造体)に関するタグです。

Q&A

解決済

3回答

2223閲覧

構造体のアロー演算子と変換指定子の関係

dotbot

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

structure

このタグは、プログラム言語におけるデータ型structure(構造体)に関するタグです。

0グッド

0クリップ

投稿2020/01/05 09:41

編集2020/01/05 09:43

質問に至った経緯

僕は今C言語の構造体の単元を学習しています。そこで -> 演算子を使って色々試していたらよくわからない状況に出会ったので質問することを決めました。

発生している問題・エラーメッセージ

エラーは出ず、実行できます。

該当のソースコード

#include <stdio.h> #define NAME_LEN 10 struct student { char name[NAME_LEN]; int height; float weight; long schols; }; int main(void){ struct student takao = { "Takao", 173, 86.2}; printf("takao->name : %s %p\n", (&takao)->name, (&takao)->name); printf("takao->name : %s %p\n", takao.name, takao.name); return 0; }

実行結果

takao->name : Takao 0x7ffc1c327ce0 takao->name : Takao 0x7ffc1c327ce0

わからないこと

なぜこのコードでエラーなく実行できてしまうんでしょうか。%s と %p にそれぞれ同じモノを表示させているのに実行できてしまう理由がわかりません。どなたか教えてくださると嬉しいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

p->m は (p).m と同じです。
なので
(&takao)->name
→ (
(&takao)).name
→ (*&takao).name
→ (takao).name
→ takao.name

takao.name の型は char[] すなわち(文字列を指す)ポインタ。
書式 %s はポインタを文字列とみなし'\0'が見つかるまでを出力し、
書式 %p はポインタをそのまま値として16進で出力します。

投稿2020/01/05 10:05

episteme

総合スコア16612

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

%s と %p にそれぞれ同じモノを表示させているのに実行できてしまう理由がわかりません。

それぞれの変換指定子の内容を確認してみましょう(man)。

  • %s…文字列の先頭へのポインタを引数に取り、文字列の内容を表示する
  • %p…voidポインタを引数に取り、そのアドレスを出力する

ということで、どちらもポインタを取ります。

投稿2020/01/05 09:48

maisumakun

総合スコア145963

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/01/05 09:49

データを指すポインタはvoid*としても解釈できます。
guest

0

同じことをしているからです
(&takao)->nameとtakao.nameは同じものを表しています

投稿2020/01/05 09:47

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問