例えば,3次元の char 型ポインタでしたら,
char ***ptr;
と表現すれば良いと思うのですが,これが例えば,次のソースコードのように変数dimの値によって,dim次元の char 型ポインタを定義したい場合,どのように記述すればよいのでしょうか?
void func(int dim) { // dim次元の char 型ポインタ ptr を定義したい return; } void main(void) { int dim=3; func(dim); }
どなたかわかる方いらっしゃいましたら,教えていただきたいです.
なぜそのようなことが必要になったのでしょうか?
n次元配列のメモリ確保をする関数を作成したく,その際に,整数引数dimによってdim次元ポインタを定義する必要がありました.
例えば,3次元配列のメモリ確保関数ですと,次のようになります.
define ALLOC_CUBIC(T,U,V,W) (T***)AllocCubic(sizeof(T),U,V,W)
void*AllocCubic(int s, int u, int v, int w)
{
int i,j;
int t=s*w, p=sizeof(char*);
char ***a,**b,*c;
a=(char***)malloc(p*u + p*u*v + s*u*v*w);
if(a){
b=(char**)(a+u);
c=(char*)(b+u*v);
}else return 0;
for(i=0;i<u;i++){
a[i]=b;
for(j=0;j<v;j++){
b[j]=c;
c+=t;
}
b+=v;
}
return a;
}
3次元とわかっていれば,
char ***a,**b,*c;
また,4次元とわかっていれば,
char ****a,***b,**c,*d;
と定義すればよいのですが,dim次元の場合,どのように定義すればよいのか知りたく,質問させていただきました.
一応...
型 **a;は二次元配列とは関係ありませんし、
型 ***b;は三次元配列とは別物です。
*がn個ついたポインタはn次元のデータ構造を表すのに使えますがn次元のポインタとは呼びませんし、それで表されるデータ構造はCの用語において決して「n次元配列」と呼ばれるものではありませんので勘違いなきよう。
(Javaだったらちょっと事情は違うかもしれませんが。)
コーディング段階で動的な次元数のポインタ変数の定義はできないといったことは、
他の方の回答で済んでいると思うので、動的な次元数を扱う選択肢の提案を。
使用が許されるのであれば、OpenCVのMatを使うという手も。
データにアクセスするためのat()等も準備されてます。
内部的には連なったメモリでアクセスも早いと思います(計っていないですが)