将C数组传递给函数



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

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

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

void readSingleArray(char* arr[], int count) {
  for(int i=0; i<count; i++) {
    printf("%sn", arr[i]);
  }
}
void readSingleArray2(char** arr, int count) {
  for(int i=0; i<count; i++) {
    printf("%sn", 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("%sn", 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("%sn", 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("%sn", 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("%sn", 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("%sn", arr[i][x]);
    }
  }
}

如果你有一个声明为

的数组
T array[N];

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

T *ptr;

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

char* arr2[2][2];

,那么你可以按照下面的方式重新声明

typedef char * T[2];
T arr2[2];

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

T *ptr;

作为参数传递。

现在将T替换为它的实际类型,您将得到

char * ( *ptr )[2];

其中char *[2]是数组arr2的元素类型

每个二维数组实际上都是一维数组,而一维数组的元素又是一维数组。也就是说,它是一个数组的数组

相关内容

  • 没有找到相关文章

最新更新