如何使可变大小的2d数组指向(并表示)c中一维数组的起始地址?

如何使可变大小的2d数组指向(并表示)c中一维数组的起始地址?,c,multidimensional-array,C,Multidimensional Array,我正试着做下面的事情 float* A = fill_float(); //in other words A is full float aIn2D[n/p][n] = &A; //the 2d array should be able to alter the 1d 我尝试了上面的方法,但没有编译(关于不能使大小变长的问题?)。也试过 float** aIn2D = &A 但现在回想起来,这是荒谬的,因为float**怎么会神奇地知道我想要一个[n/p][n]的行、列分布(

我正试着做下面的事情

float* A = fill_float(); //in other words A is full
float aIn2D[n/p][n] = &A; //the 2d array should be able to alter the 1d
我尝试了上面的方法,但没有编译(关于不能使大小变长的问题?)。也试过

float** aIn2D = &A
但现在回想起来,这是荒谬的,因为float**怎么会神奇地知道我想要一个[n/p][n]的行、列分布(我不认为是这样,因为程序在第一次访问aIn2D时就崩溃了)

那么,有人知道如何做类似于float aIn2D[n/p][n]=&A;在c中

编辑:还有一件事,我确信[n/p][n]的大小将是A所持有数据量的大小


edit2:一个非常重要的方面是两个数组指向同一个内存位置,aIn2D只是我在下面的方法中轻松访问A的一种方式。

如果你想将二维数组转换为一维数组,那么你应该这样做:

float a[MAX];
float dup_a[ROW][COL];
int i,j,k;
for(i = 0 ; i < MAX ; i++)
{
  j= i / ROW ;  // you can do it by i / COL also 
  k= i % ROW ; // you can do it by i % COL also 
  dup_a[j][k] = a[i];
}

如果要将二维数组转换为一维数组,则应尝试以下操作:

float a[MAX];
float dup_a[ROW][COL];
int i,j,k;
for(i = 0 ; i < MAX ; i++)
{
  j= i / ROW ;  // you can do it by i / COL also 
  k= i % ROW ; // you can do it by i % COL also 
  dup_a[j][k] = a[i];
}

假设n_行和n_列是变量,假设有一个n_行*n_列1D浮点数组,要将其视为n_行x n_列2D数组

使用支持可变大小阵列的C99,您实际上可以做您想做的事情:

float* A = fill_float();
float (*aIn2D)[n_cols] = (float (*)[n_cols])A;
否则,您可以执行以下操作:

float *A = fill_float();
float **aIn2D = malloc(n_rows*sizeof(float*));

{
  int i=0;
  for (; i!=n_rows; ++i) {
    aIn2D[i] = A + i*n_cols;
  }
}

// Use aIn2D[row][col]

free(aIn2D);

假设n_行和n_列是变量,假设有一个n_行*n_列1D浮点数组,要将其视为n_行x n_列2D数组

使用支持可变大小阵列的C99,您实际上可以做您想做的事情:

float* A = fill_float();
float (*aIn2D)[n_cols] = (float (*)[n_cols])A;
否则,您可以执行以下操作:

float *A = fill_float();
float **aIn2D = malloc(n_rows*sizeof(float*));

{
  int i=0;
  for (; i!=n_rows; ++i) {
    aIn2D[i] = A + i*n_cols;
  }
}

// Use aIn2D[row][col]

free(aIn2D);

n是常数还是变量?n和n/p是变量,我想我应该在问题中加入可变大小的2d数组,那么n是常数还是变量?n和n/p是变量,我想我应该把可变大小的2d数组放在问题中,抱歉,当语言有真实的2d矩阵时,不要去模拟2d矩阵matrices@JensGustedt:我已经更新了我的答案,以反映如何使用C99.-1进行教学,在C中使用malloc的结果。读和。@Lundin:这是残忍和不必要的惩罚。如果您使用C99或更高版本编写代码,则从
malloc()
中强制转换返回值并没有害处;您必须在范围内拥有
malloc()
的原型。只有在使用C89时,如果未声明的函数没有收到警告/错误,并且没有包含
-这意味着你是一个草率的编码者,
malloc()
的转换可能是你的问题中最小的一个。@JonathanLeffler绝对没有理由转换malloc的结果,这样做只表明您不了解C、C99中的指针转换规则。大多数时候,这是因为人们试图在C++编译器上编译C代码,这一直是个坏主意。无论如何,OP已经修复了它,所以我删除了否决票,按照这个网站的政策。否决票被认为是用于教育,而不是惩罚。当语言有真实的2D矩阵时,不要去模拟2D矩阵matrices@JensGustedt:我已经更新了我的答案,以反映如何使用C99.-1进行教学,在C中使用malloc的结果。读和。@Lundin:这是残忍和不必要的惩罚。如果您使用C99或更高版本编写代码,则从
malloc()
中强制转换返回值并没有害处;您必须在范围内拥有
malloc()
的原型。只有在使用C89时,如果未声明的函数没有收到警告/错误,并且没有包含
-这意味着你是一个草率的编码者,
malloc()
的转换可能是你的问题中最小的一个。@JonathanLeffler绝对没有理由转换malloc的结果,这样做只表明您不了解C、C99中的指针转换规则。大多数时候,这是因为人们试图在C++编译器上编译C代码,这一直是个坏主意。无论如何,OP已经修复了它,所以我删除了否决票,按照这个网站的政策。否决票被认为是用来进行教育,而不是作为一种惩罚。