ポインタの算術を理解するために、ptrがアドレス1000を指す整数ポインタであると考えてみましょう.32ビットの整数を仮定すると、ポインタに対して以下の算術演算を実行します
ptr++
上記の操作の後、ptrが増分されるたびに、ptrは位置1004を指します。これは、現在の位置の次の4バイトである次の整数位置を指します。 この操作では、メモリ位置の実際の値に影響を与えることなく、ポインタを次のメモリ位置に移動します。 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 previous 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
No comments:
Post a Comment