Cprogramming-c-pointer-arithmetic
C-ポインター演算
cのポインターはアドレスであり、数値です。 したがって、数値で実行できるのと同じように、ポインターで算術演算を実行できます。 ポインターで使用できる4つの算術演算子があります:+、-、、および-
ポインター演算を理解するために、 ptr はアドレス1000を指す整数ポインターであると考えてみましょう。 32ビット整数を想定して、ポインタで次の算術演算を実行しましょう-
ptr++
上記の操作の後、ptrがインクリメントされるたびに、現在の位置の4バイトである次の整数位置を指すため、 ptr は位置1004を指します。 この操作は、メモリ位置の実際の値に影響を与えることなく、ポインタを次のメモリ位置に移動します。 ptr がアドレスが1000の文字を指す場合、次の文字は1001で使用できるため、上記の操作は位置1001を指します。
ポインターをインクリメントする
定数ポインターであるため増分できない配列名とは異なり、変数ポインターは増分できるため、プログラムでは配列の代わりにポインターを使用することをお勧めします。 次のプログラムは、配列の後続の各要素にアクセスするために変数ポインタをインクリメントします-
#include <stdio.h>
const int MAX = 3;
int main () {
int var[] = {10, 100, 200};
int i, *ptr;
/*let us have array address in pointer*/
ptr = var;
for ( i = 0; i < MAX; i++) {
printf("Address of var[%d] = %x\n", i, ptr );
printf("Value of var[%d] = %d\n", i, *ptr );
/*move to the next location*/
ptr++;
}
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Address of var[0] = bf882b30
Value of var[0] = 10
Address of var[1] = bf882b34
Value of var[1] = 100
Address of var[2] = bf882b38
Value of var[2] = 200
ポインターのデクリメント
同じ考慮事項は、以下に示すように、そのデータ型のバイト数だけ値を減らすポインタのデクリメントにも適用されます-
#include <stdio.h>
const int MAX = 3;
int main () {
int var[] = {10, 100, 200};
int i, *ptr;
/*let us have array address in pointer*/
ptr = &var[MAX-1];
for ( i = MAX; i > 0; i--) {
printf("Address of var[%d] = %x\n", i-1, ptr );
printf("Value of var[%d] = %d\n", i-1, *ptr );
/*move to the previous location*/
ptr--;
}
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Address of var[2] = bfedbcd8
Value of var[2] = 200
Address of var[1] = bfedbcd4
Value of var[1] = 100
Address of var[0] = bfedbcd0
Value of var[0] = 10
ポインターの比較
ポインターは、==、<、>などの関係演算子を使用して比較できます。 p1とp2が、同じ配列の要素など、相互に関連する変数を指している場合、p1とp2を有意義に比較できます。
次のプログラムは、前の例を変更します-変数ポインターをインクリメントすることにより、ポインターが指すアドレスが配列の最後の要素のアドレス(&var [MAX-1])以下である限り増分します-
#include <stdio.h>
const int MAX = 3;
int main () {
int var[] = {10, 100, 200};
int i, *ptr;
/*let us have address of the first element in pointer*/
ptr = var;
i = 0;
while ( ptr <= &var[MAX - 1] ) {
printf("Address of var[%d] = %x\n", i, ptr );
printf("Value of var[%d] = %d\n", i, *ptr );
/*point to the next location*/
ptr++;
i++;
}
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます-
Address of var[0] = bfdbcb20
Value of var[0] = 10
Address of var[1] = bfdbcb24
Value of var[1] = 100
Address of var[2] = bfdbcb28
Value of var[2] = 200