我正在尝试和学习C语言,创建了一个数组,并将它和它的大小一起传递给一个函数,这样我就可以遍历这个数组并打印它的所有元素(所以我给了这个函数两个参数:数组本身和它的大小)。
但现在,我只需将一个参数传递给函数即可完成所有这些操作。我通过使用指针让它工作了一点,但我不知道如何停止,因为我没有任何关于数组长度的信息,它只能在下面的代码中工作,因为我将数组长度放在for循环中。但是,如果我不知道大小,并且只向函数传递了一个参数,那么一般情况下如何工作呢?
我想,如果指针指向我当前使用的数组外部,可能会以某种方式实现,但这是可行的吗?
void printArray(int *p){
for(int i=0; i<4; i++){
printf("%d ", *(p+i));
}
}
int main(){
int myArray[4] = {8,4,1,1};
int *p = myArray;
printArray(p);
return 0;
}
发布于 2019-04-15 00:58:57
遍历没有长度参数的指向数组的唯一方法是,如果数组包含不同的终结器值。
例如,C字符串是char
值的“NULL终止”数组。您可以遍历char*
,因为您知道要测试'\0'
字符是否存在,该字符的整数值为0。
由于它适用于您问题中的代码,因此您可以使用-1作为终止符,如下所示:
void printArray(int *p){
while (*p != -1{
printf("%d ", *p++);
}
}
但是,请注意,这样做需要有某种方法将有效的int
值解释为“无效”。
大体上,只将数组的长度传递给函数要容易得多。
发布于 2019-04-15 01:18:04
除了前面提到的其他方法之外,我还可以提供另外两种方法:
1)可以将数组的长度作为第一个元素传递(就像Pascal中的一些容器一样):
#include <stdio.h>
void print_array(int *arr)
{
int length = arr[0];
for (int index = 1; index <= length; ++index)
printf("%d ", arr[index]);
printf("\n");
}
int main()
{
int length = 10;
int *arr = malloc(sizeof(int) * length);
arr[0] = length;
for (int index = 1; index <= length; ++index)
arr[index] = index * index * index;
print_array(arr);
free(arr);
return 0;
}
2)您可以为您的阵列创建一个struct
(就像在使用class
的C++ STD中为std::vector
创建一样):
#include <stdio.h>
typedef struct Array
{
int size;
int *data;
} Array;
void print_array(Array *arr)
{
for (int index = 0; index < arr->size; ++index)
printf("%d ", arr->data[index]);
printf("\n");
}
int main()
{
int length = 10;
Array *arr = malloc(sizeof(Array));
arr->data = malloc(sizeof(int) * length);
arr->size = length;
for (int index = 0; index < length; ++index)
arr->data[index] = index * index * index;
print_array(arr);
free(arr->data);
free(arr);
return 0;
}
https://stackoverflow.com/questions/55677594
复制相似问题