我可以使用指针,但我有点害怕使用它们.
如果需要动态数组,则不能转义指针.不过,你为什么会害怕呢?它们不会咬人(也就是说,只要你小心).C中没有内置的动态数组,您只能自己编写一个.在C++中,您可以使用内置的std::vector
类.C#和几乎所有其他高级语言都有一些类似的类,可以为您管理动态array.
如果您确实计划编写自己的数组,可以从以下内容开始:大多数动态数组实现的工作方式都是从某个(小)默认大小的数组开始,然后每当您在添加新元素时耗尽空间时,将数组的大小增加一倍.正如您在下面的示例中看到的,这一点也不困难:(为简洁起见,我省略了安全判断)
typedef struct {
int *array;
size_t used;
size_t size;
} Array;
void initArray(Array *a, size_t initialSize) {
a->array = malloc(initialSize * sizeof(int));
a->used = 0;
a->size = initialSize;
}
void insertArray(Array *a, int element) {
// a->used is the number of used entries, because a->array[a->used++] updates a->used only *after* the array has been accessed.
// Therefore a->used can go up to a->size
if (a->used == a->size) {
a->size *= 2;
a->array = realloc(a->array, a->size * sizeof(int));
}
a->array[a->used++] = element;
}
void freeArray(Array *a) {
free(a->array);
a->array = NULL;
a->used = a->size = 0;
}
使用它同样简单:
Array a;
int i;
initArray(&a, 5); // initially 5 elements
for (i = 0; i < 100; i++)
insertArray(&a, i); // automatically resizes as necessary
printf("%d\n", a.array[9]); // print 10th element
printf("%d\n", a.used); // print number of elements
freeArray(&a);