C言語関係掲示板

過去ログ

No.117.2次元配列をポインタを使って順に出力


No.674

ポインタ
投稿者---ゆうか(2001/12/09 19:49:10)


ポインタ変数と配列なんですが、以下のプログラムがうまく実行できません。
どこがおかしいのですか?よろしくお願いします。
#include <stdio.h>

main()
{
int s[3][3]={1,2,3,
4,8,7,
4,3,2};
int *s_pnt;
int i,t;

s_pnt=s[3][3];

for(i=0;s[i]>0;++i){
printf("s[%2d]=%d,*(s_pnt+%2d)=%d\n",i,s[i],i,*(s+i));
}

printf("\n");
while(*s_pnt>0){
printf("s_pnt=%4x,*s_pnt=%d\n",s_pnt,*s_pnt);
++s_pnt;
}
}

No.675

Re:ポインタ
投稿者---ともじ(2001/12/09 21:18:40)


ゆうかさん、こんばんは。

> ポインタ変数と配列なんですが、以下のプログラムがうまく実行できません。
> どこがおかしいのですか?よろしくお願いします。

提示しているプログラムは、2次元配列をポインタを使って、順に出力するプログラム
でいいですね。

・ 最初の配列の宣言ですが、プログラム中でストッパーとして0より大を
  使っているので、0を追加します。
・ s_pnt=s[3][3]; はポインタに配列のアドレスを設定する部分ですが、
  s[3][3]はアドレスではなく、配列の中身です。しかも、最初のs[3][3]の宣言
  ですと、配列のエリア外、つまり不定値になっています。
・ for(i=0;s[i]>0;++i){
    printf("s[%2d]=%d,*(s_pnt+%2d)=%d\n",i,s[i],i,*(s+i));
  }
  s[i]が示すのは、2次元配列のそれぞれの配列の先頭です。
  ここ参考にしてください。

とりあえず、以上を踏まえて、ソース修正しました。

#include <stdio.h>
int main(void)
{
/*	int s[3][3]={1,2,3,
		     4,8,7,
		     4,3,2};	*/
	int s[4][3]={1,2,3,		/* ストッパーの0を追加 */
		     4,8,7,
		     4,3,2,
		     0,0,0};
	int *s_pnt;
/*	int i,t;	*/	
	int i,j;			/* t削除、j追加 */

/*	s_pnt=s[3][3];		s[3][3]は上記配列の一番最後の0です */
	s_pnt=s[0];			/* 配列の先頭アドレスをポインタに設定 */

/*	for(i=0;s[i]>0;++i){
		printf("s[%2d]=%d,*(s_pnt+%2d)=%d\n",i,s[i],i,*(s+i));
	}	*/	
	for(i=0;i<3;++i){
		for(j=0;j<3;++j){
			printf("s[%2d][%2d]=%d,*(s_pnt[%2d]+%2d)=%d\n",i,j,s[i][j],i,j,*(s[i]+j));
			/* *(s[i]+j) は s[i]のアドレス+jの中身 です */
		}
	}	
	printf("\n");

/* これは、2次元配列がメモリ上で連続していることを使ったアクセスです */
	while(*s_pnt>0){	/* ストッパーの0までループ */
		printf("s_pnt=%4x,*s_pnt=%d\n",s_pnt,*s_pnt);
		++s_pnt;
	}
	return(0);
} 


No.679

Re:ポインタ
投稿者---shu(2001/12/09 22:32:50)
http://c2c-1.rocketbeach.com/~finder_s/ccc/


構造体を使ったものをつくってみました。

上記のURLにある "arry.c" ファイルを参考にどうぞ


戻る


「初心者のためのポイント学習C言語」 Last modified:2002.01.11
Copyright(c) 2000-2002 TOMOJI All Rights Reserved