• ベストアンサー

二次元配列のポインタについて教えて下さい

今日はCの配列のポインタについて質問いたします、宜しくお願いします。 1次元の配列からは、 =================================== int *p , a={1,2,3}; p = &a; printf("%d\n" , p[1] ) ; printf("%d\n" , *p[1] ) ; ===================================== でaの値がとれますが、 二次元の配列では下のような書き方ではエラーになります。 何故でしょうか、どう書いてやればいいのでしょう。 ===============================================  printf("%d\n" , pbb[1][1] ) ;  printf("%d\n" , *pbb[1][1] ) ; =============================================== 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

> 要は > /* > printf(" *C[1][1] %d " , *(pC[1][1])); > */ > とあるように、二次元配列で、特定の配列要素の値を取り出したいのですが、上記の用に書くとエラーがでます、 一次元配列も二次元配列も、同じint*で扱えるはずがありません。 int (*pC)[5]; のようにして、要素の数を知らせてやらないと、コンパイラにはpC[0][4]の次がpC[1][0]になることがわかりません。 また、*(pC[1][1])という表記もおかしいです。

htgotk_001
質問者

お礼

m-take0220さん、回答ありがとうございます。 >int (*pC)[5]; #この宣言はどこのところで書いてやる書式でしょうか。 #int (*pC)[5]={1,2,3,4,5}; とか、 #int (*pC)[2][5]={{1,2,3,4,5}, {7,8,9,0,1}, {2,3,4,5,6}};   のような書き方でしょうか。 よろしくお願いします。

その他の回答 (6)

回答No.7

> >int (*pC)[5]; > #この宣言はどこのところで書いてやる書式でしょうか。 元のソースで int *pC; となっている部分を置き換えるだけです。 あとは、 pC = C; としてやれば、各要素にpC[i][j]の形でアクセスできるはずです。

htgotk_001
質問者

お礼

m-take0220さん、有り難うございます。 何とかできました。

  • 7o8
  • ベストアンサー率55% (5/9)
回答No.6

解決にはなっていなく申し訳ないのですが、2次元配列をポインタに渡す際は 1次元配列で書き直すのも一つの手です。 ってことで、私なら単純にこーします。 printf(" *C[1][1] %d " , pC[1*5+1]); 因みにpCへのC先頭アドレスの渡し方は「pC = &C[0][0];」が正しいです。 「pC = &C ;」の行はかなり怪しいアドレスが入る可能性がありますし、 そもそも意図が分かりません。 #まだpC = C ;の方が意図はわかります。(^_^;;;

noname#96502
noname#96502
回答No.5

>#int (*pC)[5]={1,2,3,4,5}; とか、 そう思うなら実際にコンパイルしてみたらいいですよ。 せめて試してから質問して欲しいです。 一番の勉強は自分でコンパイルさせて(エラーがでるならどこが悪いのか考えて)、デバッグしで動作を確認する事です。 人が作ったプログラムを動かしてもあまり意味がないです。

noname#96502
noname#96502
回答No.3

代理回答 ポインタのアドレスを正しく出力できているのに、ポインタが指し示す実データの出力が出来ていないだけです。 printf(" *C[%d][%d] %p " , i , j, pC+k); //アドレスの出力 printf(" C[%d][%d] %p " , i , j, *(pC+k)); //中身の出力 これで思ったプログラムになるはずです。(検証はしてません。) ポインタを使ってますが、ポインタとは何かもう一度考えたほうがよさそうですね。 >pC = &C ; この無駄コードがとても心配です。 コンパイラに依存するかもしてませんが、恐らく意図した動きはしません。意図して書く人のプログラムは修正するのは油断できなさそうなので、ちょっと尻込みします。 ポインタはC言語最大の難関です。理解している気になって理解できていない人も意外といますので、がんばってください。 また理解できたからといって無駄にポインタを使いまくるのも辞めといたほうが無難です。

htgotk_001
質問者

お礼

bravheartさん、回答ありがとうございます。 >printf(" C[%d][%d] %p " , i , j, *(pC+k)); //中身の出力 #中身の出力を 「printf(" C[%d][%d] %p " , i , j, *(pC[][])); のような通常(?)の配列形式で書いて出力をさせてやりたいのです。その書式があれば知りたいのですが、そのような書き方はできないのでしょうか。 よろしくお願いします。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

提示されたソースは、お手元にあるものと 本当に同じですか?ちゃんと全部をコピー&ペーストしていますか? kの定義がないため、コンパイルが通りません。 必要なヘッダーファイルのインクルードもありませんしね。 それから、「何をしたときにどんな」エラーが出るかの提示はナシですか?

htgotk_001
質問者

お礼

asuncionさん、何度もすみません、宜しく尾根がします。 要は /* printf(" *C[1][1] %d " , *(pC[1][1])); */ とあるように、二次元配列で、特定の配列要素の値を取り出したいのですが、上記の用に書くとエラーがでます、 エラーの出ない書き方を知りたいだけなのですがで、、、 =============================================================== #include <stdio.h> int main() { int i , j ; int k = 0; int C[5][5] ; int *pC ; printf("\n\n") ; for(i = 0 ; i < 2 ; i ++) { for( j = 0 ; j < 5 ; j ++) { k ++ ; C[i][j] = k ; printf(" C[%d][%d] %d " , i , j, C[i][j]); } printf("\n"); } pC = &C ; pC = &C[0][0]; printf("\n\n") ; k = 0 ; for(i = 0 ; i < 2 ; i ++) { for( j = 0 ; j < 5 ; j ++) { k ++ ; printf(" *C[%d][%d] %p " , i , j, pC+k); //アドレスの出力 } printf("\n"); } printf("\n\n") ; pC = &C ; k = 0 ; for(i = 0 ; i < 2 ; i ++) { for( j = 0 ; j < 5 ; j ++) { printf(" *C[%d][%d] %d " , i , j, *(pC+k)); k ++ ; } printf("\n"); } /* printf(" *C[1][1] %d " , *(pC[1][1])); */ return 0; }

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

>int *p , a={1,2,3}; このaの定義は間違っていますね。 配列になっていないです。 > printf("%d\n" , pbb[1][1] ) ; > printf("%d\n" , *pbb[1][1] ) ; pbbを定義している箇所とセットで見せてください。 それから、「エラーになる」だけではなく、 「何をしたときにどんな」エラーが出るかを具体的に書いてください。 ここを見ている人たちには超能力者はいません。 質問者さんが出してくる情報「だけ」が頼りです。

htgotk_001
質問者

お礼

asuncionさん、回答有り難う御座います、配慮が足りなかったです、宜しくお願い致します。 ============================================================ int main() { int C[5][5] ; int *pC ; printf("\n\n") ; for(i = 0 ; i < 2 ; i ++) { for( j = 0 ; j < 5 ; j ++) { k ++ ; C[i][j] = k ; printf(" C[%d][%d] %d " , i , j, C[i][j]); } printf("\n"); } pC = &C ; printf("\n\n") ; k = 0 ; for(i = 0 ; i < 2 ; i ++) { for( j = 0 ; j < 5 ; j ++) { k ++ ; printf(" *C[%d][%d] %p " , i , j, pC+k); } printf("\n"); } pC = &C ; k = 0 ; for(i = 0 ; i < 2 ; i ++) { for( j = 0 ; j < 5 ; j ++) { printf(" *C[%d][%d] %d " , i , j, *(pC+k)); k ++ ; } printf("\n"); } printf(" *C[1][1] %d " , *(pC[1][1])); return 0; }

関連するQ&A

専門家に質問してみよう