- ベストアンサー
*(アスタリスク)の記述について
こんにちは。 凄く初歩的な質問で申し訳ないのですが、 int* a; int *a; この二つには、何か違いがあるのでしょうか? 僕が勉強した本には、後者のような書き方でポインタの説明がありましたが、よく前者の書き込みが見られ、同じものなのか悩んでいます。 また、インターネットであれこれ検索している際、 int** a= new int*[2]; とあったのですが、もう訳がわかりません(苦笑) どういうつくりになっているのか、お手数ですが解説願えませんでしょうか? 関係あるかわかりませんが、 今、BorlandC++Builder5を使って、 Builder関係のサイトで調べながら勉強しているところです。 お手数ですが、回答よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>int** a= new int*[2]; >どういうつくりになっているのか、お手数ですが解説願えませんでしょうか? 例えば int x[2]; x[0] = 0; x[1] = 1; この配列xを動的に確保するなら int *x = new int[2]; x[0] = 0; x[1] = 1; となりますよね?次に int x[] = { 0, 1 }; int y[] = { 2, 3 }; int *a[] = { x, y }; int b = a[1][0]; // bには2が代入される この配列aを動的に確保するには int **a = new int*[2]; a[0] = x; a[1] = y; int b = a[1][0]; // bには2が代入される となります。 つまり、int** a= new int*[2]; という形を見たら、配列の先頭アドレスを2つ格納する配列を確保していると考えればいいわけです。 これさえわかっていれば int *****p = new int****[2]; のようにアスタリスクが増えても恐れる必要がなくなります。 =の左側がアスタリスク5つなら、右側は1つ少ない4つになり、p[?][?][?][?]と参照できる事になります。(もちろん初期化せずに参照してはいけません)
その他の回答 (4)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
蛇足ですが…… int* a; は、C言語の人たちが、 int *a; は、C++の人たちが、 それぞれ使う傾向にあるようです。 あくまでも、「傾向」ですが。
お礼
回答ありがとうございます。 お礼が送れて申し訳ありませんでした。 そんな傾向があるんですねー。 なぜなんでしょうね? 面白い話、ありがとうございます!
- goma_2000
- ベストアンサー率48% (62/129)
1) int *a; int* a; はどちらも同じです。好きな方を使ってください。 2) int** a= new int*[2]; ですが、 int **a; はintのポインタポインタ型です。(ポインタへのポインタですね。)int *[2]はint*型の2つの配列です。 例えば、 int *a=new int [2]; は大丈夫ですよね。それのポインタ版だと思ってください。って混乱しちゃうかな? 誤解を恐れずに言うと、配列とポインタは同じように振舞います。ですので、ポインタの配列はポインタポインタになります。
お礼
回答ありがとうございます。 お礼が送れて申し訳ありませんでした。 intのポインタのポインタ・・・(苦笑 頭がこんがらがってきますね。 あ。配列に、ポインタを『インクリメントしながらアクセスする方法、 初心者本で読んだことがあるのを思い出しました! こういう使い方するんですねー(実際はまだわかったつもりなだけでうがw) 回答ありがとうございました。ポインタについて、また色々勉強してみます。
>この二つには、何か違いがあるのでしょうか? ありません。 同じです。 >int** a= new int*[2]; 1. 「intのポインタ」の大きさ2の配列を確保 2. 1のアドレスをa(「intのポインタ」のポインタ)へ代入 です。 「intの配列」の先頭アドレスが「intのポインタ」になるのと同じで、 「intのポインタの配列」の先頭アドレスは「intのポインタのポインタ」になります。 詳しく知りたければ下記の本をお薦めします。 「秘伝C言語問答 ポインタ編」
お礼
回答ありがとうございます。 お礼が送れて申し訳ありませんでした。 ご紹介いただいた本は残念ながら近所に売っていなかったのですが、 「C言語ポインタ完全制覇」という評判の良い本があったので買ってみました。 これで勉強してみます。 こういう本が出ているということは、ポインタで悩んでいたのは僕だけではないのかな?と 少し安心しました(笑 頑張ってみますね!
- hello_world
- ベストアンサー率46% (15/32)
1.int* aとint *aの違いについて 違いはありません。記述者の書き方の違いです。 しかしながら int* a,b(またはint *a,b)と書いたときポインタ扱いになるのはaだけですので私は変数がポインタである事が明示的に判るように int *a と書くように心がけています。 2.int** a=new int*[2] これはnewを除けばCの基本のお話になります。このプログラムを動かしてみましたか?正常に動作しないはずです。ポインタが判っている事を前提に書きます。 int** a=new int*[2] はint型のサイズ2つ分領域を取得します。*aの領域確保です。因みにaはダブルポインタですので当然*aが指す領域はまだ確保されていません。 2番の回答は我ながら大分端折っている気がします…判りにくかったらごめんなさい。
お礼
回答ありがとうございます。 お礼が送れて申し訳ありませんでした。 2に関しては、まだ理解が十分ではありませんが、 そもそも、*にポインタとは別な意味があって なにか知らない記述形式なのではとさえ思っていたので、 これらがすべてポインタだとわかっただけでもかなりの前進でした! ありがとうございました!
お礼
みなさん、回答ありがとうございます。 お礼が遅れており申し訳ありません。 みなさんのおかげで大体理解でき始めています。 ・・・が、まだ「??」なところもあり、 みなさんの回答を何度も見返しているところです。 後ほど一人一人お礼の文を書きますので、申し訳ありませんが もうしばらくお待ちください。
補足
詳細な説明、ありがとうございます。 しかし、int *****p = new int****[2]; は壮観ですねー! 思わずパニック発作を起こしそうになりますが、 冷静に見ると理解できなくないですね(笑 こういう説明をお待ちしていました! ありがとうございました!