5

サイズ1024のarrという名前の配列があります。基本的に、配列の最初のX要素を削除したいと思います。どうすればいいですか?これは私が考えていることです: 配列の最初の値 (arr[0]) を指すポインターを作成します。ポインター演算を実行して、配列の X 番目の要素に取得します。次に、arr[0] をポインター p に設定します。これにより、最初の X 要素が効果的に削除されますか? これは機能しますか?または、配列の最初の X 要素を削除する簡単な方法はありますか?

4

6 に答える 6

4

配列はグローバルであるため、プログラムが終了するまでメモリに存在します。しかし、これは、内部項目の 1 つを指すポインターを宣言し、このポインターを配列の開始点として使用することを止めるものではありません。あなたの表記法:char* p = arr + X;この方法は、 、 などにp[0]等しくなります。arr[X]p[1]arr[X + 1]

于 2013-07-13T02:02:03.870 に答える
3

可能であれば、関数 memmove をチェックしてください。これは、メモリのチャンクをすばやく移動するための優れた方法です。

于 2013-07-13T01:58:42.503 に答える
2

arrが thenとして宣言されている場合は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;

于 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 に答える