如何在不知道大小的情况下遍历数组
how to iterate through an array without knowing the size in c
我有一个指向 C 中数组的指针,我想遍历它,但我不知道它的大小:
int *array;
我不确定我应该如何进行。我在想我应该尝试通过以下方式找到尺寸:
int array_size = sizeof(array) / sizeof(int);
但我不知道这是否可行。我想知道是否有更好的方法来做到这一点?
你不能在不知道元素数量的情况下迭代 C 中的数组。
请注意 sizeof(array) / sizeof(array[0])
不适用于指针,即它不会给出数组中元素的数量。
它也不会在函数内部工作,在函数中由于数组衰减为指针而将数组作为参数传递。
如果数组不包含已知的标记值(例如,包含字符串的字符数组将终止零字符作为标记值'[=12=]'
),那么您将找不到它的结尾。
如果你有这样的指针
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)
的计算结果为指针的大小,因此将其除以元素的大小是没有意义的。
函数获取元素数量的最佳方法是将其作为单独的参数提供。
如果这不切实际,有不同的方法可以推断元素的数量,这取决于调用者必须遵守的约定:
数组可以有已知固定数量的元素
数组可以将标记值作为数组的最后一个元素。
通常使用空指针 (NULL
) 作为指针数组的标记,例如 main()
函数的 char *argv[]
参数,但请注意int argc
也提供了这个功能。
空字节([=16=]
)用于告诉C字符串的结尾,它是char
的数组。
在您的情况下,您可以考虑使用 0
或 -1
来表示数组的结尾,但函数的所有调用者都必须一致地使用此约定。
I have a pointer to an array in c to which I would like to iterate through but I don't know the size:
如果你真的有一个指向数组的指针,你就走运了,因为指向数组的指针的类型包含关于数组大小。
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
的指针和有关原始数组的信息some_array[]
的尺寸无法通过 array
获得。
int some_array[7] = {1,2,3,4,5,6,7};
int *array = some_array; // Not a pointer to an array
在另一个变量中携带有关数组大小的信息。
size_t some_array_n = sizeof some_array/ sizeof some_array[0];
我有一个指向 C 中数组的指针,我想遍历它,但我不知道它的大小:
int *array;
我不确定我应该如何进行。我在想我应该尝试通过以下方式找到尺寸:
int array_size = sizeof(array) / sizeof(int);
但我不知道这是否可行。我想知道是否有更好的方法来做到这一点?
你不能在不知道元素数量的情况下迭代 C 中的数组。
请注意 sizeof(array) / sizeof(array[0])
不适用于指针,即它不会给出数组中元素的数量。
它也不会在函数内部工作,在函数中由于数组衰减为指针而将数组作为参数传递。
如果数组不包含已知的标记值(例如,包含字符串的字符数组将终止零字符作为标记值'[=12=]'
),那么您将找不到它的结尾。
如果你有这样的指针
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)
的计算结果为指针的大小,因此将其除以元素的大小是没有意义的。
函数获取元素数量的最佳方法是将其作为单独的参数提供。
如果这不切实际,有不同的方法可以推断元素的数量,这取决于调用者必须遵守的约定:
数组可以有已知固定数量的元素
数组可以将标记值作为数组的最后一个元素。
通常使用空指针 (
NULL
) 作为指针数组的标记,例如main()
函数的char *argv[]
参数,但请注意int argc
也提供了这个功能。空字节(
[=16=]
)用于告诉C字符串的结尾,它是char
的数组。在您的情况下,您可以考虑使用
0
或-1
来表示数组的结尾,但函数的所有调用者都必须一致地使用此约定。
I have a pointer to an array in c to which I would like to iterate through but I don't know the size:
如果你真的有一个指向数组的指针,你就走运了,因为指向数组的指针的类型包含关于数组大小。
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
的指针和有关原始数组的信息some_array[]
的尺寸无法通过 array
获得。
int some_array[7] = {1,2,3,4,5,6,7};
int *array = some_array; // Not a pointer to an array
在另一个变量中携带有关数组大小的信息。
size_t some_array_n = sizeof some_array/ sizeof some_array[0];