Arrays 在c语言中,如何在不知道数组大小的情况下遍历数组
我有一个指向C中的数组的指针,我想遍历它,但我不知道它的大小:Arrays 在c语言中,如何在不知道数组大小的情况下遍历数组,arrays,c,pointers,implicit-conversion,sizeof,Arrays,C,Pointers,Implicit Conversion,Sizeof,我有一个指向C中的数组的指针,我想遍历它,但我不知道它的大小: int*数组; 我不确定该如何进行。我在想,我可能应该尝试通过以下方式找到尺寸: int array_size = sizeof(array) / sizeof(int); 但我不知道这是否可行。我想知道是否有更好的方法来实现这一点?在不知道元素数的情况下,不能在c中迭代数组 请注意,sizeof(array)/sizeof(array[0])对指针不起作用,即它不会给出数组中的元素数 它在函数内部也不起作用,因为数组衰减到指针
int*数组;
我不确定该如何进行。我在想,我可能应该尝试通过以下方式找到尺寸:
int array_size = sizeof(array) / sizeof(int);
但我不知道这是否可行。我想知道是否有更好的方法来实现这一点?在不知道元素数的情况下,不能在c中迭代数组 请注意,
sizeof(array)/sizeof(array[0])
对指针不起作用,即它不会给出数组中的元素数
它在函数内部也不起作用,因为数组衰减到指针,数组作为参数传递。如果数组不包含已知的前哨值(例如,包含字符串的字符数组的前哨值为终止零字符
'\0'
),则无法找到其结尾
如果你有这样一个指针
int *array;
然后表达式sizeof(array)
将生成指针本身的大小,该大小不取决于指针是指向int
类型的单个对象,还是指向数组中元素数已知的整数数组的第一个元素。例如,根据使用的系统,该大小可以等于4
或8
。因此,表达式sizeof(array)/sizeof(int)
通常会产生1
或2
因此,还必须将数组中的元素数显式传递给函数
如果将指针传递给整个数组,则可以确定数组中的元素数。比如说
void f( int( *a )[10] );
//...
int a[10];
//...
f( &a );
在这种情况下,取消对函数中指针的引用将得到数组类型的对象。因此表达式
sizeof(*a)
将产生原始数组的大小。在C中,无法从指向元素的指针判断数组中的元素数sizeof(array)/sizeof(*array)
仅适用于实际数组,而不适用于指针,指针是函数作为参数接收的,即使在函数原型中使用了数组语法。在本例中,sizeof(array)
的计算结果是指针的大小,因此除以元素的大小是没有意义的
函数获取元素数的最佳方法是将其作为单独的参数提供
如果这是不可行的,有不同的方法来推断元素的数量,依赖于调用方必须遵守的约定:
- 数组可以具有已知的固定数量的元素
- 数组的最后一个元素可以是sentinel值
通常使用空指针(
)作为指针数组的哨兵,例如null
函数的main()
参数,但请注意,char*argv[]
也提供给此函数 空字节(int argc
)用于指示C字符串的结尾,C字符串是\0
字符的数组
在您的情况下,您可以考虑<代码> 0 <代码>或<代码> -1代码>来表示数组的结尾,但是该约定必须由函数的所有调用方一致使用。
int some_array[7] = {1, 2, 3, 4, 5, 6, 7};
int (*pointer_to_an_array)[7] = &some_array;
#define N (sizeof(*pointer_to_an_array) / sizeof(*pointer_to_an_array[0]))
for (size_t i = 0; i < N; i++) {
printf("%d\n", (*pointer_to_an_array)[i]);
}
在另一个变量中携带有关数组大小的信息
size_t some_array_n = sizeof some_array/ sizeof some_array[0];
如果你只有指针,那你就不走运了。必须将大小传递给数组的函数。内容必须有一个表示数组结束的终止符。
sizeof(array)/sizeof(int)
如果只有指针而没有原始数组定义,则将不起作用sizeof(array)
在这种情况下将是sizeof(int*)
,它始终是一个指针的大小。即使使用while循环,它也不会工作?如果没有大小或终止值,则循环的类型是无关的。您建议如何在没有大小或终止值的情况下结束循环?你不能。最重要的是,我看不到有人直接告诉你,你拥有的不是数组。它只是一个指针。数组在C中有固定的大小,用[]
声明,这将允许您方便地迭代一个数组。如果没有固定大小,它就不是数组。当然,您的数组
可能指向为数组分配的一些内存,但这并不能使数组
成为一个数组,C编译器也是这样认为的。我想用指向整个数组的指针来说明这一点,但后来没有:虽然从技术上讲是正确的,但它也是毫无意义的:如果您知道大小10的话(为了声明指针,您必须这样做),您也可以像往常一样简单地将指针传递到第一个元素,然后只对10个元素进行迭代。数组指针在C语言中也是不惯用的——由于上述原因,没有人使用它,因此人们会重复使用它。@Peter,这与您编写的不完全一样,因为可以根据泛型调用函数ic选择。“通用选择”:不确定你的意思---你能举个例子吗?@Peter,你可以使用_Generic为数组指针的具体类型选择一个函数。在tit的例子中,在所有这类函数中,最好使用带有sizeof运算符的表达式,而不是直接使用常量,因为代码是重复的。有趣的是,我有一个我没听说过。也许在答案中加入一个例子吧!
size_t some_array_n = sizeof some_array/ sizeof some_array[0];