C - 指向矩阵的指针

Pan*_*kis 2 c pointers matrix

我试图通过引用将矩阵传递给函数.该函数将替换A[i][j]矩阵的每个元素-A[i][j].我首先创建矩阵:

float a[3][4] =
{
    {1.0f, 0.0f, 0.0f, 0.0f},
    {0.0f, 1.0f, 0.0f, 0.0f},
    {1.0f, 1.0f, 0.0f, 0.0f},
};
Run Code Online (Sandbox Code Playgroud)

然后,我获得指向这个矩阵的指针:

float*** pa = &a;
Run Code Online (Sandbox Code Playgroud)

然后,我介绍以下功能:

void process(float ***matrix, int nRows, int nCols){
 short i;
 short j;
 for (i=0 ; i<nRows; i++){
   for (j=0 ; j<nCols ; j++){
     (*matrix)[i][j] *= -1;
   }
 }
}
Run Code Online (Sandbox Code Playgroud)

我称之为:

process(pa,3,4);
Run Code Online (Sandbox Code Playgroud)

我的程序无法执行并返回:

Segmentation fault: 11
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

答案摘要:基于此问题收到的问题的一些注释:

I.可以使用上述功能,只要a有点不同地初始化以便成为a float**.特别是:

int numberOfRows = 3;
int numberOfColumns = 4;
float **a = (float **) malloc(sizeof (float *) * numberOfRows);
for (i = 0; i < numberOfRows; ++i) {
    a[i] = (float *) malloc(sizeof (float) * numberOfColumns);
}
Run Code Online (Sandbox Code Playgroud)

然后,它被传递给函数processas process(&a, 3,4);.

II.或者,可以使用以下功能:

void multi_by_minus(float *matrix, int nRows, int nCols) {
  short i,j;
  for (i = 0; i < nRows; i++) {
      for (j = 0; j < nCols; j++) {
          matrix[i * nCols + j] *= -1;
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

将矩阵视为一维数组.在这种情况下,我们只需将其调用为multi_by_minus(&a, 3, 4);

III.最后,我们可以使用以下方法:

void process2(int nRows, int nCols, float (*matrix)[nCols]) {
  short i, j;
  for (i = 0; i < nRows; i++) {
    for (j = 0; j < nCols; j++) {
        matrix[i][j] *= -1;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我们提供指针a,即我们调用它process2(3,4,&a);.通过这种方式,我们可以在2D中获得对矩阵元素的访问.

imr*_*eal 8

因为您已经在提供内存,所以不需要三指针.如果要在de函数内部分配内存,则可以使用它.

如果不提供至少1维的大小,则无法索引2维矩阵.原因是编译器需要生成代码以考虑两个维度来访问正确的偏移量.在这种特殊情况下,我建议将一个简单的指针和索引作为一维数组传递,如下所示:

void process(float *matrix, int nRows, int nCols){
 short i;
 short j;
 for (i=0 ; i<nRows; i++){
   for (j=0 ; j<nCols ; j++){
     matrix[i * nCols + j] *= -1;
   }
 }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样调用它:

process((float*)a,3,4);
Run Code Online (Sandbox Code Playgroud)

这样您就可以手动索引缓冲区.