質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

3回答

382閲覧

ポインタの型変換(?)について

hiyori_

総合スコア4

C

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

0グッド

1クリップ

投稿2022/05/25 07:17

c言語のポインタを学び始めたものです。
以下の*(char*)&a[3]と*((char*)a)の意味がよくわかりません。
元々short型のものをchar型に変換してという感じでしょうか?
ご教授いただけますと幸いです。

c

1short a[4] = {2,3,4,5}; 2 3printf("%02x\n",*(char*)&a[3]); 4printf("%02x\n",*((char*)a));

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

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

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

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

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

hoshi-takanori

2022/05/25 10:36

そもそも short a[4] = { 2, 3, 4, 5 }; がメモリ上でどうなるかは分かりますか? short a[4] = { 1234, 3, 4, 5678 }; だったら?
guest

回答3

0

*(char*)&a[3]
→バラして逆順:

a[3] : 要素 a[3] & : のアドレスを (char*) : char*とみなして * : そのアドレスが差す値

投稿2022/05/25 07:33

episteme

総合スコア16614

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

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

hiyori_

2022/05/25 07:55

とても分かりやすいご説明ありがとうございます! *((char*)a)はa[4]の先頭アドレスを(char *)として認識するという解釈であってますでしょうか? またchar*とみなすというのはどういった意味になるのでしょうか? 重ねての質問ですみません..
episteme

2022/05/25 10:54

> *((char*)a)はa[4]の先頭アドレスを(char *)として認識するという解釈であってますでしょうか? YES. > またchar*とみなすというのはどういった意味になるのでしょうか? キャスト:(char*) なしで *&a[3] とすると結局 a[3] (型はshort) となります。 *(char*)&a[3] とすることで、a[3] の char値を得ることになりますね。
guest

0

ベストアンサー

short型は2バイトの整数ですが、これを1バイト毎に分割して、
分割した1バイトのデータを印字したいときに、このようなことをします。

short a[4] = {2,3,4,5};
は、最後の要素に5が格納されていますが、4660が格納されているケースを想定してください。
short a[4] = {2,3,4,4660}; のように格納されています。

4660は16進数では,0x1234になります。
short int型は2バイトなので、1バイト目=0x34と2バイト目=0x12となります。
ここから、最初の1バイト目を取り出して、印字したいときに、

C

1printf("%02x\n",*(char*)&a[3]);

とします。
結果は、34が表示されます。

投稿2022/05/26 06:30

tatsu99

総合スコア5438

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

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

jimbe

2022/06/16 17:50

念の為、 > short int型は2バイトなので、1バイト目=0x34と2バイト目=0x12 は動作しているハードに由りますということで。
tatsu99

2022/06/16 23:21

はい。リトルエンディアン前提で、回答しています。
guest

0

元々short型のものをchar型に変換して

ちょっと違う。修正の依頼にあるように、大きい数字だったら、どうなる? です。
aa という配列の先頭アドレスを指します。
従って、&a[0] == a で同じアドレスを示す。

short は 2byteで、charは 1byte。従って short *は、指定アドレスに shortのデータ(2byte)があるとみなして、値を取得。 一方 char *は、指定アドレスにcharのデータ(1byte)があるとみなして値を取得。
shortのデータが 1byteに収まるならば、、(正しくは符号があるから、127まで) 同じ数値となるが、それ以上では違うでしょう。 (試してみましょう)

投稿2022/05/25 11:14

pepperleaf

総合スコア6383

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問