提示コードですが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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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総合スコア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総合スコア11996
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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
総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。