web-dev-qa-db-ja.com

Cで最後から配列にアクセスしますか?

最近、Cでは、次の宣言のarrayと_&array_の間に重要な違いがあることに気付きました。

_char array[] = {4, 8, 15, 16, 23, 42};
_

前者はcharへのポインターであり、後者は6文字の配列へのポインターです。また、_a[b]_が*(a + b)の構文糖であることも注目に値します。確かに、あなたは_2[array]_を書くことができ、それは標準に従って完全に動作します。

したがって、この情報を利用してこれを書くことができます。

_char last_element = (&array)[1][-1];
_

_&array_のサイズは6文字なので、_(&array)[1])_は配列の直後にある文字へのポインターです。 _[-1]_を見て、最後の要素にアクセスしています。

これにより、たとえば配列全体を交換できます。

_void swap(char *a, char *b) { *a ^= *b; *b ^= *a; *a ^= *b; }

int main() {
    char u[] = {1,2,3,4,5,6,7,8,9,10};

    for (int i = 0; i < sizeof(u) / 2; i++)
        swap(&u[i], &(&u)[1][-i - 1]);
}
_

最後に配列にアクセスするこの方法には欠陥がありますか?

10
nowox

I =ベクトルの長さ-1を設定するforループを実行し、毎回それを増やすのではなく、0より大きくなるまで減らします。for(int i = vet.length;i>0;i--)

0