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

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

詳細はこちら
C

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

Q&A

解決済

1回答

657閲覧

Cの文法(&、ポインタ、構造体関係)を教えてください。

Mr.kyousuke

総合スコア13

C

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

0グッド

0クリップ

投稿2021/02/09 06:05

編集2021/02/09 06:07

ある組み込みのソースを読んでいて、以下の関数:SRAM_readの
引数:①:&val.v16と②:&p->boot[pos]は文法的に何を表しているのでしょうか?

①:構造体変数valのメンバv16のポインタを表しているのか?
②:構造体変数ポインタpのメンバboot[pos]のポインタを示しているのか?

構造体変数、構造体変数ポインタの先頭に&がついており、見たこともなく文法が全くわかりません。
どなたかわかりやすく解説していただけないでしょうか。
もしくは良いサイトなどあれば教えてほしいです。

define SRAM_ADDR 0x30000000

typedef pack struct _log_info {
char id[4];
uint16 boot[6];
} log_info;

typedef pack111 union {
uint16 v16;
uint64 v64;
} u_val;

int boot_log_get( uint16 pos, uint16 *dat )
{
log_info *p = (log_info *)SRAM_ADDR;
u_val val;

SRAM_read( &val.v16, &p->boot[pos], sizeof(val.v16) ); if( dat ) *dat = val.v16; return 0;

}

void SRAM_read( void *d, void *s_SRAM, uint32 n )
{
・・・・・
・・・・・
}
}

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

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

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

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

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

guest

回答1

0

ベストアンサー

演算子の優先順位を参照してください。

  1. . は (単項の) & よりも高い優先度を持つのでそちらと先に結合します。 ですから &val.v16&(val.v16) であると考えてよく、メンバがある場所を指しています。
  2. ->. と同水準の優先度が設定されているので同様です。

投稿2021/02/09 06:14

SaitoAtsushi

総合スコア5684

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

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

Mr.kyousuke

2021/02/09 06:24

早速のご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問