繁体   English   中英

将C数组传递给函数

[英]Passing C arrays to functions

我正在尝试理解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]);
    }
  }
}

我读到多维数组实际上是一维数组或一个内存块,编译器将弄清楚如何访问适当的数组项: 如何将多维数组传递给C和C ++中的函数 这对我来说很有意义, 所以我的问题是为什么我可以对单个数组使用char** arr ,但是在使用多维数组时却无法使用。 因为无论如何,我只需要访问数组的第一个内存地址,因为它总是一个连续的位块

这些函数声明

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];这样声明的数组,则第二个函数声明是错误的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的元素的类型

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM