问题描述
我有一个指向 C 中数组的指针,我想遍历它,但我不知道大小:
int *array;
我不确定我应该如何进行。我在想我应该尝试通过以下方式找到尺寸:
int array_size = sizeof(array) / sizeof(int);
但我不知道这是否可行。我想知道是否有更好的方法来做到这一点?
解决方法
在 C 中,无法通过指向元素的指针来判断数组中元素的数量。 sizeof(array) / sizeof(*array)
仅适用于实际数组,不适用于指针,指针是函数接收的参数,即使在函数原型中使用了数组语法。在这种情况下,sizeof(array)
的计算结果是指针的大小,因此将其除以元素的大小是没有意义的。
函数获取元素数量的最佳方法是将其作为单独的参数提供。
如果这不切实际,有不同的方法来推断元素的数量,依赖于调用者必须遵守的约定:
-
数组可以有一个已知的固定数量的元素
-
数组可以有一个哨兵值作为数组的最后一个元素。
通常使用空指针 (
NULL
) 作为指针数组的标记,例如char *argv[]
函数的main()
参数,但请注意 {{ 1}} 也提供给这个函数。空字节(
int argc
)用于告诉C字符串的结束,它是\0
的数组。在您的情况下,您可以考虑使用
char
或0
来表示数组的结尾,但是您的函数的所有调用者都必须一致地使用此约定。
如果不知道元素的数量,就不能在 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 中的数组的指针,我想遍历该数组,但我不知道大小:
如果您真的有一个指向数组的指针,那么您很幸运,因为指向数组的指针的类型携带有关数组大小的信息。
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]);
}
不幸的是,对于 int *array;
,代码没有指向数组的指针,而是指向 int
的指针和 {{1} 的原始数组大小信息}} 无法通过 some_array[]
使用。
array
在另一个变量中携带有关数组大小的信息。
int some_array[7] = {1,7};
int *array = some_array; // Not a pointer to an array