2次元配列内のデータをポインタのポインタで参照する

教育用の覚書。

// 2次元配列内のデータをポインタのポインタで参照するための
// ポインタのポインタを作成する関数
#include <stdlib.h>
double **matrixToPtrPtr ( // 戻り値
  double *a // 参照される配列 a[N0][N1]
  ,int N0   // 配列の第1添字の配列長
  ,int N1   // 配列の第2添字の配列長
){
  double **pointer= malloc( sizeof(double*)*N0 );
  int i;
  for ( i=0 ; i<N0 ; i++ ) {
    *(pointer+i)=a+i*N1;
  }
  return pointer;
}

// ポインタのポインタによる配列の参照を確かめるためのテスト関数
#include <stdio.h>
void printfPtrPtr ( double **a , int N0 , int N1 ) {
  int i,j;
  for ( i=0 ; i<N0 ; i++ ) {
    for ( j=0 ; j<N1 ; j++ ) {
      printf("a[%d][%d]=%f\n",i,j,a[i][j]);
    }
  }
}

// エントリポイント関数
#define N_SIZE 3
#define Nx N_SIZE
#define Ny N_SIZE
int main(void){
  double b[Nx][Ny]={{1,2,3},{4,5,6},{7,8,9}};
  double **a= matrixToPtrPtr((double*)b,Nx,Ny);
  printfPtrPtr(a,Nx,Ny);
  free(a);
  return 0;
}