将C数组传递给函数

时间:2015-06-06 16:55:06

标签: c arrays multidimensional-array

我正在尝试理解C中的指针,我认为到目前为止我已经掌握了。我试图理解数组以及如何将它们传递给函数。我的理解是,当将数组传递给函数时,它通过引用传递,并且当将数组传递给函数时,它指向内存中数组的开头或数组的第一个内存地址。所以如果我像这样创建一个数组:

char* arr[2] = {"Andrew", "Schools"};

我可以定义以下函数来接受这个实际传递指向数组中第一项的指针的数组:

void readSingleArray(char* arr[], int count) {
  for(int i=0; i<count; i++) {
    printf("%s\n", arr[i]);
  }
}

void readSingleArray2(char** arr, int count) {
  for(int i=0; i<count; i++) {
    printf("%s\n", arr[i]);
  }
}

第二个函数接受char** arr而不是char* []。所以我理解这一点:因为我有一个指针数组,这告诉编译器我想访问一个指向char的指针,所以任何一种方式都可以。

现在,如果我像这样定义一个多维数组:

char* arr2[2][2] = {{"Andrew", "Schools"},{"Computer", "Programmer"}};

我可以定义以下功能:

void readMultiDimArray(char* arr[2][2], int count, int count2) {
  for(int i=0; i<count; i++) {
    for(int x=0; x<count2; x++) {
      printf("%s\n", arr[i][x]);
    }
  }
}

但不是这个功能:

void readMultiDimArray2(char** arr, int count, int count2) {
    for(int i=0; i<count; i++) {
    for(int x=0; x<count2; x++) {
      printf("%s\n", arr[i][x]);
    }
  }
}

我读到多维数组实际上是单维数组或单个内存块,编译器将弄清楚如何访问相应的数组项:How to pass a multidimensional array to a function in C and C++。这对我来说很有意义所以我的问题是为什么我可以将char** arr用于单个数组,但是当使用多维数组时,这将无效。因为我怎么看,无论如何,我只需要访问数组的第一个内存地址,因为它总是一个连续的位块

1 个答案:

答案 0 :(得分:1)

这些函数声明

void readMultiDimArray(char* arr[2][2], int count, int count2) {
  for(int i=0; i<count; i++) {
    for(int x=0; x<count2; x++) {
      printf("%s\n", arr[i][x]);
    }
  }
}

void readMultiDimArray2(char** arr, int count, int count2) {
    for(int i=0; i<count; i++) {
    for(int x=0; x<count2; x++) {
      printf("%s\n", arr[i][x]);
    }
  }
}

不等效,如果要将声明为char* arr2[2][2];的数组作为函数的参数传递,则第二个函数声明是错误的。正确的函数声明至少看起来像

void readMultiDimArray2( char * ( *arr )[2], int count, int count2) {
    for(int i=0; i<count; i++) {
    for(int x=0; x<count2; x++) {
      printf("%s\n", arr[i][x]);
    }
  }
}

如果你有一个声明为

的数组
T array[N];

其中T为某种类型,然后当数组传递给具有相同参数声明的函数时,它将转换为指向其第一个元素的指针。那就是它有类型

T *ptr;

所以如果你有一个像这样声明的数组

char* arr2[2][2];

然后您可以通过以下方式重新声明

typedef char * T[2];

T arr2[2];

根据上面的解释,它将被转换为

T *ptr;

何时将其作为参数传递。

现在用T取代它的实际类型,你就会得到

char * ( *ptr )[2];

其中char *[2]是数组arr2

的元素类型

每个二维数组实际上是一维数组元素,其中一维数组又是一维数组。那是它是一个数组数组。