5

重複の可能性:
C の負の配列インデックス?

配列で負のインデックスを使用できますか?

#include <stdio.h>

int main(void)
{
    char a[] = "pascual";
    char *p = a;

    p += 3;
    printf("%c\n", p[-1]); /* -1 is valid here? */
    return 0;
}
4

5 に答える 5

8

はい、アレイ-1に割り当てられたメモリ内の有効な場所を指しているため、このコンテキストでは有効ですchar a[]p[-1]と同等*(p-1)です。あなたの例の一連の割り当てに従うと、それは有効な、、a+3-1またはと同じです。a+2

編集:一般的なルールは、整数とポインターの加算/減算(さらに、ポインターに対する同等のインデックス操作)は、同じ配列または配列の末尾を超えた1つの要素を指す結果を生成する必要があるということです。有効であるために。素晴らしいメモをありがとう、EricPostpischil

于 2012-10-05T18:22:18.990 に答える
3

C 2011 オンライン ドラフト

6.5.6 加法演算子

8 ...式が配列オブジェクトのiP番目の要素を指している場合、式(同等に、) と (値nを持っている場所) は、それぞれi+n番目とi−n番目の要素を指しています。存在する場合、配列オブジェクトの要素....(P)+NN+(P)(P)-NN

鉱山を強調します。したがって、特定の例でp[-1]は、の既存の要素を指しているため、有効ですa。ただし、の存在しない要素を指しているため、有効でa[-1]ありません。同様に、有効ではない、有効でない、など。 a[-1]ap[-4]a[10]

于 2012-10-05T18:39:03.920 に答える
2

もちろん有効です。

(C99, 6.5.2p1) 「式の 1 つは型「オブジェクト型へのポインタ」を持ち、もう 1 つの式は整数型を持ち、結果は型「型」を持ちます。

于 2012-10-05T18:21:39.667 に答える
1

一般に、このような負のインデックスを使用することは、Bad Idea(TM) です。ただし、これが役立つ場所が 1 つあります。それは、trig ルックアップ テーブルです。このようなルックアップ テーブルの場合、インデックスとして何らかの角度測定を使用する必要があります。たとえば、sin度をインデックスとして使用して、-180 度から +180 度までの角度の値にインデックスを付けることができます。または、代わりにラジオンを使用したい場合は、インデックスに PI の一部の倍数、たとえば を使用できますPI/3。次に、とcosの間の値を の倍数で取得できます。-PIPIPI/3

于 2012-10-05T18:32:57.630 に答える
-2

はい、これは合法です。Cを使用すると、安全でないポインタ演算を1日中実行できるからです。ただし、これは紛らわしいので、実行しないでください。同じ質問に対するこの回答も参照してください。

于 2012-10-05T18:22:12.733 に答える