Saturday, September 1, 2018

C - ポインタ演算

cの中のポインタは数値であるアドレスです。 したがって、数値の場合と同じように、ポインタに対して算術演算を実行できます。 ポインタに使用できる算術演算子は、++、 - 、+、 - の4つです。

ポインタの算術を理解するために、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

Interfaces and their protocol stacks

インタフェースとそのプロトコルスタック 主要なネットワーク要素に精通した後、これら要素間のインタフェースをよりよく知る時期が来ています。 インタフェースは、MME、SGWおよびPGWが他のネットワーク要素(例えば、HSSまたはPCRF)と協働することを可能にする。 それらの...