サイズ1024のarrという名前の配列があります。基本的に、配列の最初のX要素を削除したいと思います。どうすればいいですか?これは私が考えていることです: 配列の最初の値 (arr[0]) を指すポインターを作成します。ポインター演算を実行して、配列の X 番目の要素に取得します。次に、arr[0] をポインター p に設定します。これにより、最初の X 要素が効果的に削除されますか? これは機能しますか?または、配列の最初の X 要素を削除する簡単な方法はありますか?
6 に答える
配列はグローバルであるため、プログラムが終了するまでメモリに存在します。しかし、これは、内部項目の 1 つを指すポインターを宣言し、このポインターを配列の開始点として使用することを止めるものではありません。あなたの表記法:char* p = arr + X;
この方法は、 、 などにp[0]
等しくなります。arr[X]
p[1]
arr[X + 1]
可能であれば、関数 memmove をチェックしてください。これは、メモリのチャンクをすばやく移動するための優れた方法です。
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;
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;