可变长度数组的原型
我正在尝试编写一个在c中采用可变大小数组的函数。
void sort(int s, int e, int arr[*]){ ... }
它表示对于可变长度数组,它需要在函数声明中有界。 那是什么意思? 我正在使用xcode 4.0,使用LLVM编译器2.0。
谢谢您的帮助。
如果您不使用C99可变长度数组,通常的解决方案是传入指向第一个元素的指针,以及要用于访问元素的任何索引。
这是一段打印出一系列数组的代码,类似于您尝试对其进行sort
。
#include static void fn (int *arr, size_t start, size_t end) { size_t idx; for (idx = start; idx <= end; idx++) { printf ("%d ", arr[idx]); } putchar ('\n'); } int main (void) { int my_array[] = {9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; fn (my_array, 4, 6); return 0; }
这将输出4到6个元素(从零开始),给出:
5 4 3
有几点需要注意。
-
在该函数中使用
my_array
调用fn
自动将数组“衰减”为指向其第一个元素的指针。 当您使用数组时,这实际上发生在大多数(并非所有)情况下,因此您不必显式声明&(my_array[0])
。 -
C已经在标准库中内置了一个非常好的排序函数,称为
qsort
。 在许多情况下,这就是你应该使用的东西(除非你有一个特定的算法要用于排序,或者你正在做家庭作业/自我教育练习)。
我看到没有人回答真正的问题,我在这里给我的。
在C99中,您有可变长度数组(VLA),它们的声明长度在运行时进行评估,而且不仅在编译时与C的早期版本一样。但是将数组传递给函数有点棘手。
一维数组总是作为指针传递
void sort(size_t n, int arr[n]) { }
相当于
void sort(size_t n, int *arr){ }
更高的尺寸很好地传递给了该function
void toto(size_t n, size_t m, int arr[n][m]){ }
相当于
void toto(size_t n, size_t m, int (*arr)[m]){ }
在这样的函数内部使用这样的定义,您可以使用表达式arr[i][j]
访问元素,并且编译器知道如何计算正确的元素。
现在出现了您发现的语法,该语法仅对您转发声明函数接口的原型有用
void toto(size_t, size_t, int arr[*][*]);
所以在这里你可以用*
替换数组维度作为占位符。 但是,只有当您没有手头的尺寸名称时,这才有用,并且使用与定义完全相同的版本要清楚得多。
void toto(size_t n, size_t m, int arr[n][m]);
通常,为了一致地使用它,在参数列表中首先获得尺寸是很重要的。 否则,当编译器解析arr
的声明时,它们将不会被知道。
你想做什么让你的论证成为一个int *
; 传递数组的长度(调用者可能知道,但这个例程没有)作为一个单独的参数。 您可以将数组作为参数传递。
对于可变长度数组,数组括号内的*
的使用仅限于原型,并且仅用作占位符。 稍后定义该函数时,数组的大小应存储在可用于任一文件范围的变量中,或存储为其中一个参数。 这是一个简单的例子:
void foo(int, int[*]); /* asterisk is placeholder */ void foo(int size, int array[size]) { /* note size of array is specified now */ }