• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:2次元配列からダブルポインタへの合わせ方)

2次元配列からダブルポインタへの合わせ方

knb-nkmの回答

  • knb-nkm
  • ベストアンサー率66% (4/6)
回答No.13

A No.6の者ですが、ちょっと間違っていたので補足です。 double (*mat)[3]; mat = (double (*)[3])mat_; が正しいですね。Matrixにキャストしても意味が無い(--; それから、呼び出し側もとりあえず、 sub( (const double **)mat ); で動きます。(gcc -Wall では) キャストで逃げるのは邪道な気はしますが、事情があれば仕方ないですね。

aneja
質問者

お礼

何度もご回答、ありがとうございます。 こういう方法があるのですね。勉強になりました。

関連するQ&A

  • 二次元配列とポインタについてよくわかりません2

    先ほどもしつもんして自分なりに改良をくわえたのですが 上手くいきません。 int main( void ) {  int i, j;  /*4 x 4 行列 A*/  double a[4][4];  double *pa;  /*4 x 4 行列 B*/  double b[4];  double (*pb)[4];  /*4 x 4 行列 C*/  double c[4];  double (*pc)[4];  pa = a;  pb = b;  pc = c;  printf("4 x 4 行列 Aの要素を入力してください>\n");  for(i = 0; i < 4; i++){   for(j = 0; j < 4; j++){    printf("A[%d,%d]=", i + 1, j + 1 );    scanf("%lf", (*(pa + i) + j)); }} printf("4 x 4 行列 Bの要素を入力してください>\n"); for(i = 0; i < 4; i++){  for(j = 0; j < 4; j++){   printf("B[%d,%d]=", i + 1, j + 1 );   scanf("%lf", &pb[i][j]); }} としたところ(途中までを表記してます)  pa = a;  pb = b;  pc = c; のところでコンパイル時に 警告で問題のあるポインタの変換とでます なぜおかしいのかまったくわからないので よければ教えてください

  • 二次元配列とポインタについてよくわかりません

    二次元配列の要素を代入しようと思って double *pa; for(i = 0; i < 4; i++){ for(j = 0; j < 4; j++){ printf("A[%d,%d]=", i + 1, j + 1 ); scanf("%lf", pa + i + j); printf("A[%d,%d]=%g\n", i + 1, j + 1, *(*(pa + i) + j) );}} とやっているのですがどうやらscanfで上手くいかず最後のprintfが表示されません あと double (*pb)[4]; printf("4 x 4 行列 Bの要素を入力してください>\n"); for(i = 0; i < 4; i++){ for(j = 0; j < 4; j++){ printf("B[%d,%d]=", i + 1, j + 1 ); scanf("%lf", &pb[i][j]);}} もうまくいきません (二通りの方法でしなければ成らないので) どうしたらいいでしょうか?

  • 2次元配列のポインタ

    整数型行2列2の2次元配列の[1][0]は、ポインタでは3になるとおもっているのですが、ちがったでしょうか? 下記のソースでエラーが出ていて困っています。 void main() { int array[2][2] = { { 9, 9 }, { 9, 9 } }; int num=2, j,i; *(array + 3) = 0; for (i = 0; i < num; i++) { for (j = 0; j < num; j++) { printf("%d", array[i][j]); } puts(""); } } 99 09 と表示させたいのですが、どこに間違いがあるのでしょうか?

  • 2次元配列

    大学の課題なのですが 10×10の2次元配列に、平面のビットパターンが入っているとする(0と1の整数が入っているとする)。左右反転して出力しなさい。 という問題で、自分は以下のプログラムを作ったのですが、うまくうごいてくれません。だれか間違いを指摘していただけないでしょうか。 よろしくお願いします。 #include<stdio.h> int main(void) { int i,j; int data[10][10]={0,1}; for(i=0;i<10;i++){ for(j=0;j<10;j++){ printf("%3d",data[10-i][10-j]); } printf("\n"); } return(0); }

  • 2次元配列にポインタを格納

    http://www.okweb.ne.jp/kotaeru.php3?q=505241の訂正版の質問です。 VC++6.0を使っております。 下のようなプログラムを作ってみました。 #include <stdio.h> #include <vector> using namespace std; class c{ public: c(); virtual ~c(); int get(){return j;}; void set(int i){j=i;}; private: c(const c &right); const c &operator=(const c &right); int j; }; void main(){ vector <vector<c*> > a; c *b; for(int n=0;n<10;n++){ for(int i=0;i<10;i++){ b=new c; a[n].push_back(b); } } for(int j=0;j<10;j++){ for(int i=0;i<9;i++){ a[i][j] -> set(i+j); } } for(j=0;j<10;j++){ for(int i=0;i<9;i++){ printf("%d ",a[i][j] -> get()); } printf("%d\n",a[9][j] -> get()); } for(int i=0;i<10;i++){ for(int j=0;j<10;j++){ delete a[i][j]; } } } すると、コンパイルには成功するのですが、実行は出来ません。 その理由は、「外部参照1が未解決」だそうです。 アドバイスをお願いいたします。

  • 一次元配列についてです

    配列matを以下の様に宣言し、連続した3つの数の和を順に書き出すプログラムを作成しています。が、条件式とprintfの出力の仕方が全く解りません。この二つが解る方、教えて頂けませんか。 #include <stdio.h> int main(void) { int i,mat[10]={5,3,8,2,7,1,10,4,9,6}; for(i=0;i<10;i++) { } printf("\n"); return(0); }

  • ダブルポインタで2次元配列を作成

    2次元配列を作り、そのアドレスなどを表示させましたが どうもおかしいです。 3行5列の配列で、3本のポインタ配列がありますが、 その配列のアドレスがかぶっているのです。 まずはコンパイルしてみてください。 #include<stdio.h> main() { int i; int k; int y=1; int **p; p=(int **)malloc(sizeof(int *)*3); for(i=0;i<=2;i++) { *(p+i)=(int *)malloc(sizeof(int)*5); } for(i=0;i<=2;i++){ for(k=0;k<=4;k++){ p[i][k]=(i+k)*y; } y=y*10; } for(i=0;i<=2;i++){ for(k=0;k<=4;k++){ printf("%4d",*(*(p+i)+k)); } printf("\n"); } printf("\n"); for(i=0;i<=2;i++) { printf("%p\n",p+i); } printf("\n"); for(i=0;i<=2;i++) { printf("%p\n",&p+i); } printf("\n"); for(i=0;i<=2;i++) { printf("%p\n",*(p+i)); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",*(p)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&*(p)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&**(p)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",*(p+1)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&*(p+1)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&**(p+1)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",*(p+2)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&*(p+2)+i); } printf("\n"); for(i=0;i<=4;i++) { printf("%p\n",&**(p+2)+i); } printf("\n"); for(i=0;i<=2;i++){ for(k=0;k<=4;k++){ printf("%p\n",&*(*(p+i)+k)); }} free(p); return 0; } どこがかぶっているかと申しますと、 for(i=0;i<=4;i++) { printf("%p\n",&*(p)+i); } と for(i=0;i<=4;i++) { printf("%p\n",&*(p+1)+i); } と for(i=0;i<=4;i++) { printf("%p\n",&*(p+2)+i); } です。 これが同じアドレスになるはずは論理的にありえないことです。 VC++2008無料バージョンです。 よろしくお願いいたします。

  • 一次元配列の添え字の出力について

    配列matを以下のように宣言し、要素の値が2の倍数、または3の倍数ならば、その添え字を書き出すプログラムを作成しています。が、どうにも上手くいかなくて困ってます。条件式に誤りがあるのだと思いますが、解る方、何処が間違っているのか教えてください。 すぐに回答が欲しいです。 #include <stdio.h> int main(void) { int i,mat[10]={5,3,8,2,7,1,10,4,9,6}; for(i=0;i<10;i++) { if(mat[i]/ 2==1 || mat[i]/ 3==1){ printf("%d",i); } } printf("\n"); return(0); }

  • ポインタと二次元配列

    二次元配列a[ ][ ]の第1行の要素以後を0にするプログラムで動きます。 疑問なんですが、4行目のa[ ][4]は、なぜ[ ]のように空欄になっているんでしょうか。 また、8行目のpa=a[1];は、なぜpa=a[0];ではだめなんでしょうか。第1行は先頭行で0行目を意味しているのではないでしょうか。 #include <stdio.h> void main(void) /*ポインタと二次元配列*/ { static int a[ ][4]={{1,2,3,0}, {4,5,6,0}, {7,8,9,-999}}; int j,k,*pa; pa=a[1]; while(*pa!=-999){ *pa=0; pa++; } for(j=0;j<3;j++){ for(k=0;k<4;k++) printf("%5d",a[j][k]); printf("\n"); } }

  • 2次元配列を使ったC言語の九九表を作りたいんですが、方法がわかりません。

    C言語で、九九の表を作っているのですが2次配列を使わないでの方法なら出来るんですが、 2次配列を使うと出来なくなってします。 下記のように途中まで組んだのですが、どうしてもエラーがでてしまいます。 #include <stdio.h> int main(void) { int i,j,a[9][9]; printf(" "); for(i=1; i<=9; i++) printf("%3d", i); printf("\n"); for(i=0; i<9; i++){ for(j=0; j<9; j++) a[i][j]= {1,2,3,4,5,6,7,8,9},{2,4,6,8,10,12,14,16,18},{3,6,9,12,15,18,21,24,27},{4,8,12,16,20,24,28,32,36},{5,10,15,20,25,30,35,40,45,6,12,18,24,30,36,42,48,54,7,14,21,28,35,42,49,56,63},{8,16,24,32,40,48,56,64,72},{9,18,27,36,45,54,63,72,81} }; for(i=0; i<9; i++){ printf("%3d", i+1); for(j=0; j<9; j++) printf("%3d",a[9][9]); printf("\n"); } return 0; } とやったのですが…以下に書く部分が間違っているようで。 #include <stdio.h> int main(void) { int i,j,a[9][9]; printf(" "); for(i=1; i<=9; i++) printf("%3d", i); printf("\n"); for(i=0; i<9; i++){ for(j=0; j<9; j++) a[i][j]=□ } for(i=0; i<9; i++){ printf("%3d", i+1); for(j=0; j<9; j++) printf("%3d", □); printf("\n"); } return 0; } 色々調べたり、少しずつ変えながら試しているのですが、できません。 どなたかわかるかたいらっしゃいますか。間違いがわかりません… 配列を使用しなくても出来ることは、わかるのですが、配列を使うバージョンでもできるようになりたいんです。 私がしようとおもっているのは、81個分の値を先に計算し、9×9の2次元配列に格納し、次に81個の配列要素の値を出力したいのですが、 間違いと方法がわかる方いらっしゃいませんか。