ここから本文です

int *a[10] としたときには、10個分のポインタが作られるのですか?

ari********さん

2014/1/2023:21:58

int *a[10]

としたときには、10個分のポインタが作られるのですか?

閲覧数:
632
回答数:
4

違反報告

ベストアンサーに選ばれた回答

khurataさん

2014/1/2200:21:37

まぁそう考えて差し支えないでしょう。以下、ちょっと厳密に書いてみます。

int * a[10];
という宣言は、
a[0] から a[9] までの、10個の配列要素の形をメモリ上に作り出し、その領域全体に a という名前を付けます。それぞれの要素の型は int * です。

つまり、intポインタを要素とする、10個要素の配列を作り、配列全体を a と呼べるようになるわけです。
それぞれの要素1つずつを見れば、これはポインタ型変数、すなわちポインタです。

短く言えば、int * a[ 10 ]; は、「ポインタの配列」を作り出す、というわけです。



付記:
なぜ上記宣言の a は「ポインタの配列」であって、「配列のポインタ」ではないのか、について付記します。ご理解の一助となれば幸いです。

int a; /* a は int型変数 */
int * a; /* a はint型を指すポインタ型変数 */
int a[ 10 ]; /* a は配列、1要素は int型変数 */
int * a[ 10 ]; /* a は配列、1要素は int型を指すポインタ型変数 */
/* ↑この a は、なぜ配列になるのか? */

int [ 10 ] * a; /* こうすれば a はポインタに?いや、コンパイルエラーです */
int [ 10 ] a *; /* これもダメです */

宣言文の中の「書く順番」は決まっています。直上の2行は、いずれも書く順番を守っていません。

実は、「配列演算子 [ ] はポインタ宣言子 * よりも優先順位が高い」のです。

ですから、int (*a)[ 10 ]; のように、カッコでくくって * の優先順位を上げると、これはポインタを作り出します。

int (*a)[ 10 ]; で作られるポインタ a は、int[10]型の配列を指すポインタです。この a で int型を指すとコンパイルエラーになります。

まとめると、次のようになります。
int * a[ 10 ]; /* a は配列であり、1要素は「int型を指すポインタ」 */
int * (a[ 10 ]); /* 上記と同じ(優先順位変わらず)通常はわざわざこう書かないが */
int (* a)[ 10 ]; /* a は「int[10]型を指すポインタ」(a は配列ではない) */

質問した人からのコメント

2014/1/25 14:48:35

ありがとうございます。.................

ベストアンサー以外の回答

1〜3件/3件中

並び替え:回答日時の
新しい順
|古い順

kei********さん

2014/1/2212:30:38

そうですね。
int型へのポインタ10個を収納する配列を、参照名aとして宣言しています。



蛇足。
ポインタとアドレスを混同している方がいらっしゃるようです・・・。

プロフィール画像

カテゴリマスター

n2q********さん

2014/1/2109:46:53

答えは Yes 。int * 型というイメージで、それが10個確保される形。

《備考》

『作られる』という部分が若干気がかりです。実行時に何らかの動作があるという意味合いが含まれるとしたら、答えは No。そういうことはありません。

あと、それが引数の場合も、やはり答えは No。ポインタを指すポインタです。配列のように見えて、そうではない。[ ] の中にある 10 というのはコメント程度の意味しか無いですよ。

k03********さん

2014/1/2023:28:22

arigatougozaimasu_111さん

1.
int *a[10]
としたときには、10個分のポインタが作られるのですか? No.

10個のポインタの入れ物が作られる

2.
int x[10]
10個の整数の入れ物が作られる

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる