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

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

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

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

2911閲覧

2次元配列のポインタを引数にして、関数で値を書き換えたい。

K.M.PEANUTS

総合スコア40

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/05/29 11:32

main関数内で2次元配列を宣言した時、main関数の外に定義した関数内でその2次元配列の値を書き換えたいです。つまりはこの2次元配列のポインタを引数にして関数に渡すと思ったのですが、うまくいきませんでした。どうすれば良いのか教えてください。
下のコードは簡易的に作ったものですみません。こんな感じのことをしたいです。

c

1 2int b(int *a) { 3 a[0][0] = 1; 4 5 return 0; 6} 7 8int main(void) { 9 int a[2][3]; 10 b(a); 11 12 return 0; 13}

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

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

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

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

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

episteme

2021/05/29 11:40

与えたいのは R行C列のint行列:int [R][C] なんでしょうけど、C は固定値ですか?
guest

回答4

0

サイズ可変版

C

1#include <stdio.h> 2 3typedef int element; 4 5/* "?行ld列 の行列 body" の row行col列に val をsetする */ 6void set_at(void* body, int ld, int row, int col, element val) { 7 ((element*)body)[row*ld+col] = val; 8} 9 10/* "?行ld列 の行列 body" の row行col列の値を getする */ 11element get_at(void* body, int ld, int row, int col) { 12 return ((element*)body)[row * ld + col]; 13} 14 15int main() { 16 element mtx[4][3]; 17 /* mtx[y][x] = x+y; */ 18 for ( int y = 0; y < 4; ++y ) { 19 for ( int x = 0; x < 3; ++x ) { 20 set_at(mtx, 3, y, x, x+y); 21 } 22 } 23 24 /* できたかな? */ 25 for (int y = 0; y < 4; ++y) { 26 for (int x = 0; x < 3; ++x) { 27 printf("%2d ", mtx[y][x] /* get_at(mtx, 3, y, x)*/ ); 28 } 29 printf("\n"); 30 } 31 return 0; 32}

投稿2021/05/29 11:57

編集2021/05/29 11:59
episteme

総合スコア16614

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

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

0

C

1int b(int a[][3]) { // あるいは a[2][3] 2 a[0][0] = 1; 3 4 return 0; 5}

でしょうか。最初の添え字だけは省略できます。

関数側でサイズを持ちたくない場合は、一次元化して位置を計算。

C

1int b(int *a, int n) { 2 a[3*n+2] = 1; 3 4 return 0; 5} 6 7int main(void) { 8 int a[10][20]={0}; 9 b((int*)a, sizeof a[0]/sizeof a[0][0]); 10 11 printf("%d\n",a[3][2]); 12 return 0; 13}

投稿2021/05/29 11:51

otn

総合スコア84798

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

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

0

素直に、関数をint b(int a[2][3]) { ではダメ?

配列サイズが固定で無い場合、ちょっと考慮が必要ですが。

投稿2021/05/29 11:49

pepperleaf

総合スコア6383

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

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

0

ベストアンサー

説明がややこしくなっちゃうのですが…

C

1int b(int (*a)[10]) 2{ 3 a[0][0] = 1; 4} 5 6int main(void) 7{ 8 int array[50][10]; 9 b(array); 10}

int (*a)[10]では、aは「int型の要素が10個の配列」を指すポインタとなります。
この[10]の部分を可変にすることはできません。

投稿2021/05/29 11:46

itagagaki

総合スコア8402

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

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

K.M.PEANUTS

2021/05/29 11:52

1次元の配列を10個、それぞれの配列の先頭要素のアドレスを渡したということですね! 納得しましたありがとうございます!!
thkana

2021/05/29 13:35

> この[10]の部分を可変にすることはできません。 gccでcだと、 int b(int n, int (*a)[n]); が通ったりします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問