2D指针的行为类似于2D数组

时间:2013-05-26 17:10:32

标签: c pointers multidimensional-array

在C中,我试图在任何函数之外声明一个2D数组,以便它可以被函数共享。我知道在单维情况下你可以做以下事情(并让它表现得像一个数组): -

#include<stdlib.h>
#include<stdio.h>

int *ptr;

int main(){
  int n=5;
  int i;

  ptr = malloc(n*sizeof(*ptr));
  for(i=0; i<n; i++){
    ptr[i] = i;
    printf("%i\n", ptr[i]);
  }
  free(ptr);
  return 0;
}

我想知道这对多维案例有何用处。

3 个答案:

答案 0 :(得分:1)

您可以使用双指针代替单个指针:

#include<stdlib.h>
#include<stdio.h>

int **ptr;

int main() {
  int n = 5;
  int m = 10;
  int i, j;

  ptr = malloc(n * sizeof(int*));
  for(i=0; i<n; i++) {
    ptr[i] = malloc(m * sizeof(int));
    for(j=0; j<m; j++) {
      ptr[i][j] = j;
      printf("%i\n", ptr[i][j]);
    } 
  }

  for(i=0; i<n; i++) {
    free(ptr[i]);
  }
  free(ptr);

  return 0;
}

你应该警惕的事情:

  • 单独分配每个阵列
  • 单独释放每个阵列,以及整个

答案 1 :(得分:0)

如果要使用带有[]运算符的两个索引来访问它,则需要使用指向int的指针并分配每个单个内部1D数组:

int **ptr = malloc(R*sizeof(int*));
for (int i = 0, i < R; ++i)
  ptr[i] = malloc(C*sizeof(int));

ptr[i][j] = 40;

但您也可以直接创建一个{1}元素的1D数组,然后通过计算正确的索引R*Cptr[R*i + j]来访问它。

答案 2 :(得分:0)

只要您修复第二个维度,您基本上可以使用相同的“技巧”:

double (*A)[42];

如果第二个维度也是动态的,你必须在函数范围内声明它:

double (*B)[n];

作为指向VLA,可变长度数组的指针,然后将指针传递给数组以作为

void f(size_t m, double (*aB)[m]);

你一次性分配这样一个2D数组

B = malloc(sizeof(double[m][n]));

因此您可以确保矩阵是连续分配的。