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

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

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

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

Q&A

解決済

5回答

1813閲覧

C言語 配列全体へのポインタとは

hogeee

総合スコア27

C

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

0グッド

0クリップ

投稿2020/09/30 05:42

C言語ではアドレス演算子を使用した場合”&a”で生成されるのは配列全体へのポインタとのことですが、並列全体へのポイントとはどんな値なのでしょうか?

例えば、"a"と書いたらそれは配列"a"の要素の先頭のポインタを表すのはわかるのですが、配列全体のポインタと何なのでしょう。

c

1int a[5];

という配列を作成したら、メモリの何処かに”a”の配列全体の大きさを表す数字が保存され、"&a"はその数字を指すポインタということでしょうか?

よろしくお願いいたします。

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

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

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

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

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

guest

回答5

0

ベストアンサー

並列全体へのポイントとはどんな値なのでしょうか?

アドレスそのものはaと書いた時(先頭要素へのポインタ)と変わりませんが、が違います。

  • aint *
  • &aint (*)[5](「intが5つの配列へのポインタ」、と読みます)

投稿2020/09/30 05:51

maisumakun

総合スコア145121

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

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

maisumakun

2020/09/30 06:02

> メモリの何処かに”a”の配列全体の大きさを表す数字が保存され、"&a"はその数字を指すポインタということでしょうか? 大きさは、C言語のコンパイラレベルの情報です。機械語にすれば失われます。
guest

0

メモリの何処かに”a”の配列全体の大きさを表す数字が保存され、"&a"はその数字を指すポインタということでしょうか?

この辺を見るに、そもそもポインタとは何かを理解していないように見えます。
(コンパイルする以前に)ポインタが持っている情報はアドレスだけではなく、それが指している対象の型が何かの情報も持ちます。
配列先頭の要素へのポインタには、その要素のアドレスと、指しているのがint型だという情報があります。
同様に、配列全体へのポインタには、その配列のアドレス(これは先頭要素のアドレスと同じです)と、指しているのがint5個の配列だという情報があります。
コンパイルすると、指す型が何だったかの情報は直接は含まれませんが、指す型に応じた操作をする機械語命令が生成されます。

投稿2020/09/30 12:44

ikadzuchi

総合スコア3047

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

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

hogeee

2020/09/30 16:45

はい、全然理解していませんw ポインタはアドレスだけでなく型も持っているのですね! 全然意識していませんでした! ちょっとそこを意識してはじめから読み直したいと思います! ありがとうございます!
guest

0

「配列全体へのポインタ」とはどこから出てきた言葉でしょうか。
一般的にはあまり使わないと思いますが、使った場合でも、

配列の先頭アドレス=配列全体へのポインタ

と考えて差し支えないと思います。
サイズさえわかれば配列全体に参照できますよ、という意味でしょうかね。
尚、ポインタはあくまでもアドレス値であるので、サイズ情報は持っていません。

投稿2020/09/30 05:48

ttyp03

総合スコア16996

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

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

maisumakun

2020/09/30 05:54

アドレスは同じですが、「配列全体を指すポインタ」と「配列の先頭を指すポインタ」は別物です。
hogeee

2020/09/30 05:56

回答有り難うございます。 「配列全体へのポインタ」という言葉は「新・明解C言語 ポインタ完全攻略」という本の中で出てきます。 本によると、 「配列名が、先頭要素へのポインタとして解釈されない例外的な文脈が存在します。 (1)、sizeof演算子のオペランドとして現れたとき。"sizeof a"によって生成されるのは配列全体への大きさです。”配列の先頭要素へのポインタ”の大きさではありません。 (2)、アドレス演算子&のオペランドとして現れたとき。配列名にアドレス演算子を適用した”式&a”によって生成されるのは配列全体へのポインタです。”配列の先頭要素へのポインタ”ではありません」 と書いてあります。
fana

2020/09/30 05:59

(質問時にそういう話を書けばいいのに)
ttyp03

2020/09/30 06:03

(同感)
guest

0

配列全体のポインタと何なのでしょう

~~
配列全体のポインタなどありません。
~~
ありました。。。

配列"a"の要素の先頭のポインタを表す

これが正解です。

投稿2020/09/30 05:48

編集2020/09/30 06:08
Y.H.

総合スコア7914

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

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

Y.H.

2020/09/30 05:52

なぜに低評価?間違っているところをコメントにて指摘頂きたいです。
maisumakun

2020/09/30 05:53

> 配列全体のポインタなどありません。 あります。
Y.H.

2020/09/30 06:07 編集

あぁ、なるほど。こういうことですね。 int a[10]; int *p; p=a; printf("%ld\n",sizeof(a)); // 40 printf("%ld\n",sizeof(*(&a))); // 40 printf("%ld\n",sizeof(p)); // 8 printf("%ld\n",sizeof(*(&p))); // 8
Y.H.

2020/09/30 23:06

回答間違ってるので低評価のままでかまいませんよ。
guest

0

配列の先頭のアドレスのポインタ、です。
どこまでアクセスするかはあなた次第ですね

投稿2020/09/30 05:48

y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問