C 作为函数参数传入数组的一部分

C 作为函数参数传入数组的一部分,c,arrays,C,Arrays,我有一个数组intarr[5]={10,2,3,5,1},我想把最后4个元素(基本上是从索引1到index4)作为数组传递到一个参数中(所以:[2,3,5,1])。有没有一种方法可以非常简单地做到这一点(比如在Ruby中如何执行arr[1..4]),或者我必须使用for循环?您可以手动将指针递增1: your_function(arr + 1) C中的指针算法隐式地说明了元素的大小,因此添加1实际上会添加1*sizeof(int) 要与其他语言的阵列切片更接近,请尝试以下功能: int *sl

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

您可以手动将指针递增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()

答复 根据您当前的代码:

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
#包括
#包括
void my_函数(int arr_size,int*arr)
{
int i;
对于(i=0;i使用更灵活的索引*/
返回退出成功;
}

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



为什么不将数组、子数组的起始索引和结束索引作为参数传递给该函数呢?这个问题可能会对您有所帮助。这可能会有所帮助:
&arr[1]
完成这项工作-只要您不想传递副本(函数不会修改数组,或者它是否会修改也无所谓)。如果要复制,必须手动进行复制。在C中不能将数组作为函数参数传递。相反,可以将初始元素的地址和大小作为单独的参数传递。为什么要使用旧式的前ANSI函数定义?使用原型
void my_函数(int arr_size,int*arr)
int main(int argc,char**argv)
解释为什么会有明显的差异。没有提到编译器或标准,所以我选择了历史风格。我在较旧的代码库中工作,由于易于记录参数,我开始喜欢这种类型的函数定义。此外,为什么我要将原型用于如此简单的事情呢?自1989年以来,旧式的函数声明和定义已经过时了。原型被添加到语言中,因为旧式声明不允许编译器检查调用的正确性。您可以编写
my_函数(“foo”,12.3,42,NULL)
,编译器不会抱怨(但它可能会在运行时崩溃)。我没有尝试错误地调用我的函数,呵呵。适当地更新了答案。
#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;
}
int dst[4];
memcpy(dst,&arr[1],size(int) * 4);