这些在功能上都是相同的。当您将数组传递给 C 中的函数时,数组会隐式转换为指向数组第一个元素的指针。因此,这三个函数将打印相同的输出(即指向char 的指针的大小)。
void func1(char* str) {
printf("sizeof str: %zu\n", sizeof str);
}
void func2(char str[]) {
printf("sizeof str: %zu\n", sizeof str);
}
void func3(char str[10]) {
printf("sizeof str: %zu\n", sizeof str);
}
此转换仅适用于数组的第一维。 char[42][13] 被转换为 char (*)[13],不是 char **。
void func4(char (*str_array)[13]) {
printf("sizeof str_array: %zu\n"
"sizeof str_array[0]: %zu\n", sizeof str_array, sizeof str_array[0]);
}
char (*)[13] 是str_array 的类型。这就是您编写“指向 13 个 chars 数组的指针”的方式。这也可以写成 void func4(char str_array[42][13]) { ... },尽管 42 在功能上没有意义,正如您可以通过实验看到的,将不同大小的数组传递到 func4。
在 C99 和 C11(但不是 C89 或 C++)中,您可以将指向可变大小数组的指针传递给函数,方法是将其大小连同它一起传递,并在 [square brackets] 中包含大小标识符。例如:
void func5(size_t size, char (*str_array)[size]) {
printf("sizeof str_array: %zu\n"
"sizeof str_array[0]: %zu\n", sizeof str_array, sizeof str_array[0]);
}
这声明了一个指向 size chars 数组的指针。请注意,您必须先取消对 指针 的引用,然后才能访问该数组。在上面的示例中,sizeof str_array[0] 计算为数组的大小,而不是第一个元素的大小。例如,要访问第 11 个元素,请使用 (*str_array)[11] 或 str_array[0][11]。