C言語やC++の配列で、負の添え字の配列を用いたり、多次元配列を動的確保する方法について説明します。
int main(){
double *a;
double dummy[2001];
a = dummy + 1000;
/* これで a[-1000]からa[1000]が使える。*/
return 0;
}
#include <stdlib.h>
int main(){
int m,n;
int i;
double **a;
m = 1000;
n = 1000;
a = (double**)malloc(m*sizeof(double*));
a[0] = (double*)malloc(m*n*sizeof(double));
for (i=1; i<m; i++){
a[i] = a[i-1] + n;
}
/* これで a[0][0] ~ a[m-1][n-1] が使える */
/* 配列を使い終わったらメモリを解放する */
free(a[0]);
free(a);
return 0;
}
int main(){
int m = 1000;
int n = 1000;
double **a = new double*[m];
a[0] = new double[m*n];
for (int i=1; i<m; i++){
a[i] = a[i-1] + n;
}
// これで a[0][0] ~ a[m-1][n-1] が使える
// 配列を使い終わったらメモリを解放する
delete[] a[0];
delete[] a;
return 0;
}
#include <stdlib.h>
int main(){
int i;
int m, n;
double **a, **dummy1;
double *dummy2;
m = 1000;
n = 1000;
dummy1 = (double**)malloc((2*m+1)*sizeof(double*));
dummy2 = (double*)malloc((2*m+1)*(2*n+1)*sizeof(double));
dummy1[0] = dummy2 + n;
for (i=1; i<=2*m+1; i++){
dummy1[i] = dummy1[i-1] + 2*n + 1;
}
a = dummy1 + m;
/* これで a[-m][-n] ~ a[m][n] が使える */
/* 配列を使い終わったらメモリを解放する */
free(dummy2);
free(dummy1);
return 0;
}
int main(){
int m = 1000;
int n = 1000;
double **dummy1 = new double*[2*m+1];
double *dummy2 = new double[(2*m+1)*(2*n+1)];
dummy1[0] = dummy2 + n;
for (int i=1; i<=2*m+1; i++){
dummy1[i] = dummy1[i-1] + 2*n + 1;
}
double **a = dummy1 + m;
// これで a[-m][-n] ~ a[m][n] が使える
// 配列を使い終わったらメモリを解放する
delete[] dummy2;
delete[] dummy1;
return 0;
}
double *a;
double b[10];
a = b - 1;
double a[10];
double *p;
int i;
p = a;
for(i=0; i<10; i++){
*p = i;
p++;
}