Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在c语言中,如何在不知道数组大小的情况下遍历数组_Arrays_C_Pointers_Implicit Conversion_Sizeof - Fatal编程技术网

Arrays 在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])对指针不起作用,即它不会给出数组中的元素数 它在函数内部也不起作用,因为数组衰减到指针

我有一个指向C中的数组的指针,我想遍历它,但我不知道它的大小:

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
    也提供给此函数

    空字节(
    \0
    )用于指示C字符串的结尾,C字符串是
    字符的数组

    在您的情况下,您可以考虑<代码> 0 <代码>或<代码> -1代码>来表示数组的结尾,但是该约定必须由函数的所有调用方一致使用。

我有一个指向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]);
  }

  
在另一个变量中携带有关数组大小的信息

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];