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

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

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

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

Q&A

解決済

1回答

1892閲覧

ポインタと配列のさまざまな表現

cingyan

総合スコア29

C

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

0グッド

0クリップ

投稿2016/07/23 08:34

C言語によるプログラミング応用編という本で、ポインタ配列の様々な表現というところに載っていた箇所です。

2次元配列の表現とポインタ配列と配列へのポインタの表現を比較してみましょう。 --- 2次元配列 char a[2][3]; --- 表現 sizeofの値 「表現」によって指される対象 a 6 aの第0要素(要素を3個もつchar配列)へのポインタ a[0] 3 aの第0要素(char)へのポインタ a[0][0] 1 aの第0要素の最初の要素 --- ポインタ配列 char *a[2] --- 表現 sizeofの値 「表現」によって指される対象 a 8 ポインタaの第0要素(charへのポインタ)へのポインタ//Q1 a[0] 4 aの第0要素(charへのポインタ) //Q2 a[0][0] 1 aの第0要素が指すchar配列の最初の要素 --- 配列へのポインタ char (*a)[3] --- 表現 sizeofの値 「表現」によって指される対象 a 4 要素を3個もつcharへのポインタ //Q3 a[0] 4 そのchar配列の先頭要素(char)へのポインタ //Q4 a[0][0] 1 その先頭要素

以上が本に載っていた部分です。
質問です。
Q1~Q4までのsizeofの値がなぜそうなるのか教えてください。
Q2は、調べた所、ポインタが指ところが、int型で4バイトだから、そうなり、私の解釈で、char :a[2]により、全体はその2倍だからQ1は、8になると思いましたが、違うような気がします。
Q3は、要素を3個もつなら、sizeofは3になるのではないかと思うのですがなぜ4なのでしょう。
Q4もなぜそうなるのか教えてください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Q1~Q4までのsizeofの値がなぜそうなるのか教えてください。

Q1:char a[2]のaはポインタ配列2個分のサイズです。ポインタが4Byteのプログラムなのであれば42で8になります。

Q2:a[0]が指すのはポインタです。上記の通り、このプログラムはポインタが4Byteと想定されているので、4になります。

Q3:aが指すのはポインタです。ですのでQ2と同じ理由で4になります。

Q4:これですが、本では4と書いてあるのでしょうか?指しているのはchar[3]ですので3になると思うのですが(実際やって3になっています)


Q2は、調べた所、ポインタが指ところが、int型で4バイトだから、そうなり、私の解釈で、char :a[2]により、全体はその2倍だからQ1は、8になると思いましたが、違うような気がします。

Q2ですが、指しているのはポインタであってintではありません。ポインタはメモリアドレスを指し示す物ですので、プログラムが64Bitプログラムの場合は64Bit(8Byte)になります。つまりコンパイルオプションなどによってサイズが変動する物です。


Q3は、要素を3個もつなら、sizeofは3になるのではないかと思うのですがなぜ4なのでしょう。

非常にややこしい、というか普通こんな宣言はしないと思うのですが、これが宣言しているaはあくまでポインタである、と考えて下さい。何故なら括弧で囲まれているからです。
aというchar[3]型ポインタであると考えて下さい。char型ではなくchar[3]の配列へのポインタです。
aはポインタなので、この設問の想定している環境では4となります。またa[0]ですが、aがポインタである為そのポインタが指す先にある実体のサイズとなります。aはchar[3]を指すポインタなので、a[0]はsizeof(char[3])となり、普通は3になると思います。

投稿2016/07/23 09:39

drednote

総合スコア336

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

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

cingyan

2016/07/24 03:01

ご回答ありがとうございました。 Q1ですが、メモリアドレスを格納しているポインタのサイズが32bitつまり4Byteだから、2つで8となると言うことでしょうか。 Q2は、a[0]はそれが一つだから4となるのですね。 Q3は、char[3]で要素が3つとか関係なく、ポインタのサイズが4Byteということでしょうか。 Q4は、私も試した所、3になりましたので、本のミスプリントということになりますね。
drednote

2016/07/24 08:22

上記全てそうです。その理解であってます。付け加えるなら、上でも書きましたがポインタは必ずしも4Byte(32Bit)とは限らないので、ポインタ=4Byteという覚え方はしないようにしてください。コンパイルのオプションなどで変わる要素です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問