从数组中删除第一个X元素

时间:2013-07-13 01:51:31

标签: c pointers

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

6 个答案:

答案 0 :(得分:4)

由于数组是全局的,因此在程序终止之前它将存在于内存中。但是这不会阻止你声明指向其内部项之一的指针,并使用此指针作为数组的开头。附上您的注释:char* p = arr + X;这种方式p[0]将等于arr[X]p[1]arr[X + 1],依此类推。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

您可以将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;
}

答案 3 :(得分:1)

如果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;

答案 4 :(得分:1)

您可以移动指针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

答案 5 :(得分:0)

根据您不使用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.

请注意,这对数组的 end 中剩余的X元素无效。如果你想将它们归零,你可以随后做这样的事情:

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