我试图理解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
的元素类型
每个二维数组实际上都是一维数组,而一维数组的元素又是一维数组。也就是说,它是一个数组的数组