我有一个名为 arr 的数组,大小为 1024。所以基本上我想删除数组的第一个 X 元素。我该怎么做?这就是我的想法:创建一个指向数组的第一个值(arr [0])的指针。进行指针运算以将其带到数组的第 X 个元素。然后将 arr[0] 设置为指针 p,这将有效地删除前 X 个元素?这行得通吗?或者有没有更简单的方法来删除数组的第一个 X 元素?
问问题
17915 次
6 回答
4
由于该数组是全局的,因此它将一直存在于内存中,直到您的程序终止。但这不会阻止您声明一个指向其内部项目之一的指针,并将此指针用作数组的开头。使用您的符号:char* p = arr + X;
这种方式p[0]
将等于arr[X]
,p[1]
to arr[X + 1]
,等等。
于 2013-07-13T02:02:03.870 回答
3
如果可以,请查看函数 memmove。这是快速移动一大块内存的好方法。
于 2013-07-13T01:58:42.503 回答
2
如果arr
被声明为char arr[1024];
那么你不能。
如果arr
声明为char * arr = (char *)malloc(1024 * sizeof(char));
then:arr += 3
或将其声明为char do_not_use_this_name[1024];
然后使用char * arr = do_not_use_this_name + 3;
于 2013-07-13T02:05:16.593 回答
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;
}
于 2013-07-13T02:06:20.863 回答
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
于 2013-07-13T02:06:16.407 回答
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。
请注意,这不会对数组末尾的剩余 X 元素做任何事情。如果您想将它们归零,您可以随后执行以下操作:
for (; destination < arr_end; ++destination)
*destination = 0;
于 2013-07-13T02:11:17.503 回答