我有一个数组int arr[5] = {10, 2, 3, 5, 1}
,我想将最后4个元素(基本上从索引1传递到index4)作为数组传递给参数(所以:[2, 3, 5, 1]
)。有没有办法非常简单地做到这一点(比如在Ruby中你可以做arr [1..4]),还是我必须使用for循环?
答案 0 :(得分:3)
您可以手动将指针递增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()
切片!
答案 1 :(得分: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
答案 2 :(得分:2)
#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;
}
答案 3 :(得分:1)
我认为你可以使用memcpy
,memcpy
可以将数据字节复制到byte.In memmory,我们的数据是二进制的,所以即使int
是4个字节,我们也可以复制它的字节到字节。
int dst[4];
memcpy(dst,&arr[1],size(int) * 4);