二次元配列のポインタはどうやってやるんですか?

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Santasan

二次元配列のポインタはどうやってやるんですか?

#1

投稿記事 by Santasan » 13年前

コード:

 
#include<stio.h>
main()
{
           void point(int **a);
           int a[8][8];
           
           point(&a);
           
           for(int i=0; i<8; i++)
           {
                      for(int i=0; i<8; i++)
                      {
                                   printf("%d, ",a[i][j]);
                      }
           }
}
void point(int **a)
{
           a[4][4] = 1;
}

このようにポインタを使って関数に渡して関数で二次元配列を変更するプログラムを作りたいんですけど
これでは動きません。
改善策をお願いします

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 二次元配列のポインタはどうやってやるんですか?

#2

投稿記事 by softya(ソフト屋) » 13年前

2次元配列はダブルポインタでは処理出来ません。
1次元配列はポインタで処理出来るんですが、これがややこしいところです。
って事で次のように書きます。※他のコンパイルエラーも直してあります。

コード:

#include<stdio.h>
main() {
	void point( int (*a)[8] );
	int a[8][8] = {0};
	int i,j;

	point( a );

	for( i = 0; i < 8; i++ ) {
		for( j = 0; j < 8; j++ ) {
			printf( "%d, ", a[i][j] );
		}
		printf( "\n" );
	}
}
void point( int (*a)[8] ) {
	a[4][4] = 1;
}
あるいは、
void point( int a[][8] )
と書いても良いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Santasan

Re: 二次元配列のポインタはどうやってやるんですか?

#3

投稿記事 by Santasan » 13年前

できました
ありがとうございました

salsaww

Re: 二次元配列のポインタはどうやってやるんですか?

#4

投稿記事 by salsaww » 13年前

コード:

#include <iostream>
#include <vector>

typedef std::vector<int> oneD;
typedef std::vector< oneD > twoD;
void pointReset(twoD& t)
{
	t[4][4]=99;
}
int main(int argc,char* argv[])
{
	twoD array(8, oneD(8,1));
	pointReset(array);

	for(twoD::iterator iter= array.begin();iter != array.end();iter++)
	{
		for(oneD::iterator inner = iter->begin();inner != iter->end();inner++)
			{	std::cout<< *inner <<", ";}
		std::cout<<std::endl;
	}
	return 0;
}
書き上げてから、c++じゃなくて、Cか…と思ったけど、折角書いたので。
Visual C++ 2008とかでも、動くようにauto変数とかfor range-based loopsとかは使ってません。
Visual C++ 2012とか、clang++ の新しいのとか、gccの新しいのなら
したのでも可能かと。

コード:

#include <iostream>
#include <vector>

typedef std::vector<int> oneD;
typedef std::vector< oneD > twoD;

void pointReset(twoD& t)
{ t[4][4]=99; }

int main(int argc,char* argv[])
{
	twoD array(8, oneD(8,1));
	pointReset(array);

	for(auto outer: array)
	{
		for(auto inner: outer)
			{	std::cout<< inner <<", ";}
		//range-based for loopsだと、
		//Iteratorじゃなくて実体が来るのでinnerの前の* が消える。
		std::cout<<std::endl;
	}
	return 0;
}

閉鎖

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