【问题标题】:Pass in part of an array as function argument将数组的一部分作为函数参数传递
【发布时间】:2016-07-24 04:29:51
【问题描述】:

我有一个数组 int arr[5] = {10, 2, 3, 5, 1},我想将最后 4 个元素(基本上从索引 1 到索引 4)作为数组传递给一个参数(所以:[2, 3, 5, 1])。有没有办法非常简单地做到这一点(比如在 Ruby 中你可以如何做 arr[1..4]),还是我必须使用 for 循环?

【问题讨论】:

  • 为什么不将数组、您想要的子数组的开始和结束索引作为参数传递给该函数。
  • 这个问题可能对你有帮助。 stackoverflow.com/questions/19646512/…
  • 也许这会有所帮助:stackoverflow.com/questions/14618342/…
  • &arr[1] 可以完成这项工作——只要你不想传递一个副本(该函数不会修改数组,或者它是否修改也没关系)。如果你想复制,你必须手动复制。
  • 您不能将数组作为 C 中的函数参数传递。相反,您可以将初始元素的地址和大小作为单独的参数传递。

标签: c arrays


【解决方案1】:

您可以手动将指针加 1:

your_function(arr + 1)

C 中的指针算法隐含地考虑了元素的大小,所以加 1 实际上会加 1 * sizeof(int)

要更接近于其他语言的数组切片,请尝试以下功能:

int *slice_array(int *array, int start, int end) {
    int numElements = (end - start + 1)
    int numBytes = sizeof(int) * numElements;

    int *slice = malloc(numBytes);
    memcpy(slice, array + start, numBytes)

    return slice;
}

它在给定的开始和结束索引之间创建一个数组切片。完成后记得free()切片!

【讨论】:

    【解决方案2】:

    回答

    给定你当前的代码:

    int arr[5] = {10, 2, 3, 5, 1};
    

    您可以通过以下方式复制范围 1..4:

    int arr_dup[4];
    memcpy(arr_dup,arr+1,sizeof(int)*4);
    

    记住你的函数定义应该是一个指针,例如:

    void a_function(int *arr_arg); //Call via a_function(arr_dup);
    

    说明

    c 中的数组实现为指针(也就是保存内存地址的变量)。

    如果您对指针进行算术运算,它将前进到相应的元素。示例:

    ptr + 1 //Next Element
    ptr - 1 //Previous Element
    

    【讨论】:

      【解决方案3】:
      #include <stdio.h>
      #include <stdlib.h>
      
      void my_function(int arr_size, int *arr)
      {
        int i;
        for(i=0; i < arr_size; i++)
          {
            printf("[%d]:%d\n", i, arr[i]);
          }
      }
      
      int main(int argc, char **argv)
      {
        int arr[] = { 10, 2, 3, 5, 1 };
        (void)my_function(4, &arr[1]); /* TODO > use more flexible indexing */
        return EXIT_SUCCESS;
      }
      

      【讨论】:

      • 为什么要使用旧式的 pre-ANSI 函数定义?使用原型; void my_function(int arr_size, int *arr), int main(int argc, char **argv)
      • 解释为什么会有明显的差异。没有提到编译器或标准,所以我选择了一种历史风格。我在较旧的代码库中工作,并且由于易于记录参数而喜欢这种风格的函数定义。另外,我为什么要在这么简单的事情上使用原型?
      • 自 1989 年以来,旧式函数声明和定义已过时。语言中添加了原型,因为旧式声明不允许编译器检查调用的正确性。你可以写my_function("foo", 12.3, 42, NULL),编译器不会抱怨(但它可能会在运行时崩溃)。
      • 我没有尝试错误地调用我的函数,呵呵。适当地更新了答案。
      【解决方案4】:

      我想你可以使用memcpy,memcpy可以逐字节复制数据。在内存中,我们的数据是二进制的,所以即使int是4字节,我们也可以逐字节复制。


      int dst[4];
      memcpy(dst,&arr[1],size(int) * 4);
      

      【讨论】:

        猜你喜欢
        • 2014-08-01
        • 1970-01-01
        • 2013-06-03
        • 1970-01-01
        • 2021-02-23
        • 2012-12-07
        • 2016-06-12
        • 1970-01-01
        相关资源
        最近更新 更多