2次元配列へのポインタ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
やまっち
記事: 20
登録日時: 9年前

2次元配列へのポインタ

#1

投稿記事 by やまっち » 6ヶ月前

2次元配列へのポインタ
を調べてみたのですが、理解できません。
以下のようなコードを書いたのですが、エラーになってします。
どのように書くべきか、教えて頂きたいです。

よろしくお願いします。

コード:

#include <stdio.h>

int a[3][5]={ // 2次元配列 (グローバル変数)
	{1,2,3,4,5}, // y=0
	{2,3,4,5,6}, // y=1
	{3,4,5,6,7}  // y=2
};
int b[3][5]={
	{11,22,33,44,55},
	{22,33,44,55,66},
	{33,44,55,66,77}
};

int main(){
	int x,y;
	int *p;
	x=3; y=1; // a 配列の x=3 y=1 なら 5 のはず
	
	p=a[0];
	printf("1st test %d\n",p[5*y+x]); // 1次元配列としてアクセス
	
	p=b[1]; // これで y=1 の先頭を指す
	printf("2nd test %d\n",p[3]); // b 配列の x=3 y=1 、つまり 55 のはず
	
	p=b;
	// printf("3rd test %d\n",p[1][3]); // error になる
	
	return 0;
}

/*
test.c:27:29: error: subscripted value is neither array nor pointer nor vector
  printf("3rd test %d\n",p[1][3]);
*/


アバター
usao
記事: 1889
登録日時: 11年前

Re: 2次元配列へのポインタ

#2

投稿記事 by usao » 6ヶ月前

C言語って,最近触ってないんだけど,まず

> p=b;

がコンパイル通るんだっけ? っていうところから疑問に思う感じ.

まぁそれはそれとして,
とりあえず,p が何を指しているのか(:pの値)はひとまず無視して,文法として考えれば間違ってるよね.

コード:

//int *型のポインタpがあるときに
int *p;

//これ↓は何言ってるかわからない(文法エラー)よね
p[1][3];
---

「【int】の配列」の先頭を指すためのポインタの型が「【int】*」なのであれば,
同様に考えれば
「【intの配列】の配列」の先頭を指すためのポインタの型というのは「【intの配列】 *」的な何かでなければならぬのでは?

で,実際は
「【要素数が5個であるintの配列】の配列」
といった感じで,要素数の指定も必要なので,

コード:

//これの先頭を指すには…
int b[3][5] = { ...略 };

//こんな型のポインタが必要だよね,きっと.
int (*q)[5] = b;  //q は【要素数が5個であるintの配列】を指すためのポインタ
printf( "%d\n", q[1][3] );
みたいにするんじゃない?

アバター
usao
記事: 1889
登録日時: 11年前

Re: 2次元配列へのポインタ

#3

投稿記事 by usao » 6ヶ月前

オフトピック
たまたま見かけたからコメントしてみたけども,
なんつーか,質問するならもうちょっと 普通に人がいる場所 を選んだ方がよいのではないかな? とか.
回答/コメント がつく確率的なことを考えれば.

やまっち
記事: 20
登録日時: 9年前

Re: 2次元配列へのポインタ

#4

投稿記事 by やまっち » 6ヶ月前

ありがとうございました。参考になりました。

返信

“C言語何でも質問掲示板” へ戻る