質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

3335閲覧

初学者 二次元配列を関数の引数に渡す方法が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2020/09/15 05:35

提示コードですがprint_t();関数に二次元配列xを引数で渡したいのですがどうすればいいのでしょうか?一次元ではできたのですが二次元配列になるとどうしたらいいかわかりません。

#include "stdio.h" void print_(int **t) { printf("%d\n",t[0]); } int main() { int x1[3] = {1,2,3}; int x[3][3]{ {1,2,3}, {4,5,6}, {7,8,9}, }; print_(x); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

2次元配列を渡す場合、外側の要素数は省略できません。
以下のようにする必要があります。

c

1#include "stdio.h" 2 3void print_array(int array[][3], size_t rows) 4{ 5 6 for (size_t i = 0; i < rows; ++i) { 7 for (size_t j = 0; j < 3; ++j) { 8 printf("%d ", array[i][j]); 9 } 10 printf("\n"); 11 } 12} 13 14int main() 15{ 16 int array[3][3]{ 17 {1, 2, 3}, 18 {4, 5, 6}, 19 {7, 8, 9}, 20 }; 21 22 print_array(array, 3); 23 24 return 0; 25} 26

vector で書き直した例

C++ なら C の配列でなく、std::vector を使ったほうがよいでしょう。

cpp

1#include <iostream> 2#include <vector> 3 4using Mat = std::vector<std::vector<int>>; 5 6void print_array(const Mat &mat) 7{ 8 for (size_t i = 0; i < mat.size(); ++i) { 9 for (size_t j = 0; j < mat[0].size(); ++j) { 10 std::cout << mat[i][j] << " "; 11 } 12 std::cout << std::endl; 13 } 14} 15 16int main() 17{ 18 Mat mat{ 19 {1, 2, 3}, 20 {4, 5, 6}, 21 {7, 8, 9}, 22 }; 23 24 print_array(mat); 25 26 return 0; 27}

投稿2020/09/15 06:02

編集2020/09/15 06:06
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

良い回答ではないのかもしれませんが,
ポインタ周りの文法が{混乱する,不安,見た目にうざい,etc...}であることを解消する方法として…

用途上,要素数が固定(例えば3*3だとか)で良い場合には,

//3x3でintな「2次元配列」だぜ struct Int3x3 { int Data[3][3]; };

みたいな構造体を用意してしまえば,関数引数等の見た目が楽(?)になります.

void print_( Int3x3 *t ) //←ここが見た目にシンプルになるね { printf("%d\n",t->Data[0][0] ); //要素を参照する際に毎度.Dataとか->Dataとか書かねばならなくなるが. }

C++であれば,上記コード内の

//要素を参照する際に毎度.Dataとか->Dataとか書かねばならなくなる

に関しても operator のオーバーロードあたりで解消できます.

投稿2020/09/15 06:24

編集2020/09/15 06:28
fana

総合スコア11708

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

※タグはC++ですが、コードがC言語だったのでC言語を前提とした回答です。

print_関数が受け取れるのはあくまでもx配列の先頭アドレスです。
print_関数から見たら、配列の要素数はわからない状態です。
よって関数側で明示的に要素数を指定してあげる必要があります。

引数で明示する場合①

c

1void print_(int t[3][3]) 2{ 3 //x[2][2] 4 printf("%d\n",t[2][2]); 5}

引数で明示する場合②
行数は省略できます。

c

1void print_(int t[][3]) 2{ 3 //x[2][2] 4 printf("%d\n",t[2][2]); 5}

計算で要素位置を求める場合。

c

1void print_(int *t) 2{ 3 //x[2][2] 4 printf("%d\n",t[2*3+2]); 5}

いずれの場合も、要素数をマクロで定義しておくとよいです。

c

1#define ROWS 3 2#define COLS 3 3 4void print_(int t[ROWS][COLS]) 5{ 6 //x[2][2] 7 printf("%d\n",t[2][2]); 8} 9 10void print_(int *t) 11{ 12 //x[2][2] 13 printf("%d\n",t[2*COLS+2]); 14} 15 16int main() 17{ 18 int x[ROWS][COLS]{ 19 {1,2,3}, 20 {4,5,6}, 21 {7,8,9}, 22 }; 23 24 print_(x); 25 26 return 0; 27}

投稿2020/09/15 06:10

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問