重複の可能性:
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;
}
重複の可能性:
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;
}
はい、アレイ-1
に割り当てられたメモリ内の有効な場所を指しているため、このコンテキストでは有効ですchar a[]
。p[-1]
と同等*(p-1)
です。あなたの例の一連の割り当てに従うと、それは有効な、、a+3-1
またはと同じです。a+2
編集:一般的なルールは、整数とポインターの加算/減算(さらに、ポインターに対する同等のインデックス操作)は、同じ配列または配列の末尾を超えた1つの要素を指す結果を生成する必要があるということです。有効であるために。素晴らしいメモをありがとう、EricPostpischil。
6.5.6 加法演算子
8 ...式が配列オブジェクトのiP
番目の要素を指している場合、式(同等に、) と (値nを持っている場所) は、それぞれi+n番目とi−n番目の要素を指しています。存在する場合、配列オブジェクトの要素....(P)+N
N+(P)
(P)-N
N
鉱山を強調します。したがって、特定の例でp[-1]
は、の既存の要素を指しているため、有効ですa
。ただし、の存在しない要素を指しているため、有効でa[-1]
はありません。同様に、有効ではない、有効でない、など。 a[-1]
a
p[-4]
a[10]
もちろん有効です。
(C99, 6.5.2p1) 「式の 1 つは型「オブジェクト型へのポインタ」を持ち、もう 1 つの式は整数型を持ち、結果は型「型」を持ちます。
一般に、このような負のインデックスを使用することは、Bad Idea(TM) です。ただし、これが役立つ場所が 1 つあります。それは、trig ルックアップ テーブルです。このようなルックアップ テーブルの場合、インデックスとして何らかの角度測定を使用する必要があります。たとえば、sin
度をインデックスとして使用して、-180 度から +180 度までの角度の値にインデックスを付けることができます。または、代わりにラジオンを使用したい場合は、インデックスに PI の一部の倍数、たとえば を使用できますPI/3
。次に、とcos
の間の値を の倍数で取得できます。-PI
PI
PI/3
はい、これは合法です。Cを使用すると、安全でないポインタ演算を1日中実行できるからです。ただし、これは紛らわしいので、実行しないでください。同じ質問に対するこの回答も参照してください。