繁体   English   中英

从数组中删除前 X 个元素

[英]Removing first X elements from array

我有一个名为 arr 的数组,大小为 1024。所以基本上我想删除数组的第一个 X 元素。 我该怎么做? 这就是我的想法:创建一个指向数组的第一个值 (arr[0]) 的指针。 做指针算术将它带到数组的第 X 个元素。 然后将 arr[0] 设置为指针 p,这将有效地删除前 X 个元素? 这会起作用吗? 或者有没有更简单的方法来删除数组的第一个 X 元素?

由于数组是全局的,它将存在于内存中,直到您的程序终止。 但这不会阻止您声明一个指向其内部项目之一的指针,并使用该指针作为数组的开始。 用你的符号: char* p = arr + X; 这样p[0]将等于arr[X]p[1]等于arr[X + 1] ,依此类推。

如果可以,请查看功能 memmove。 这是快速移动一大块内存的好方法。

如果arr被声明为char arr[1024]; 那么你不能。

如果arr声明为char * arr = (char *)malloc(1024 * sizeof(char)); 然后: arr += 3

或者声明为char do_not_use_this_name[1024]; 然后使用char * arr = do_not_use_this_name + 3;

您可以将arr视为循环缓冲区。 但是,您不能再像常规数组一样访问它。 你需要一个接口。

char arr[1024];
int pos = 0;
int size = 0;

#define arr(i) arr[(pos+(i))%1024]

void append (char v) {
    arr(size++) = v;
}

void remove_first_x (int x) {
    pos = (pos + x) % 1024;
    size -= x;
}

您可以移动指针X单位并将其视为数组的开始:

int arr[1024]; // could be other type as well

...

int *p = arr;
...

p += X; // x is the number of units you want to move

根据您不使用memmove并导致arr[0]返回arr[x]结果的要求,您可以执行以下操作:

char arr[1024];
int arr_size = sizeof(arr) / sizeof(*arr);
char* source;
char* destination;
char* arr_end = arr + arr_size;

//Initialise the array contents

for (destination = arr, source = arr + x; source < arr_end; ++source, ++destination)
    *destination = *source;

请记住,这只是数组的内容向后移动X。数组的大小仍然是 1024。

请注意,这不会对数组末尾的剩余 X 元素执行任何操作。 如果您想将它们归零,您可以随后执行以下操作:

for (; destination < arr_end; ++destination)
    *destination = 0;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM