C の void ポインターのポインター演算に従って、ポインターに対してポインター演算を行うことはできませんvoid
。
また、加算、乗算、除算はできませんtwo pointers
が、can subtract two pointers
.
ごと#6.5.6-2
に - ポインターとint
型を追加できます。
ポインター演算を行うための規則はありますか?
C の void ポインターのポインター演算に従って、ポインターに対してポインター演算を行うことはできませんvoid
。
また、加算、乗算、除算はできませんtwo pointers
が、can subtract two pointers
.
ごと#6.5.6-2
に - ポインターとint
型を追加できます。
ポインター演算を行うための規則はありますか?
私が知っている唯一のことは、ポインターを減算する場合、それらは同じ型であり、「同じメモリブロック」を指している必要があるということです(同じ割り当てへの2つのポインターおよび/または同じ配列への2つのポインター)。割り当ての「1 要素先」を指すこともできます。同様に、メモリ ブロックの末尾を超えて 1 つしか追加できません。
特定のアーキテクチャには異なるメモリ領域があるため、メモリのブロック全体でポインタを使用することは未定義の動作です。これは、ある領域へのポインタが別の領域からの別のポインタから単純に (またはまったく) 減算されないようにするためです ("良い" 結果) - たとえば、16 ビット モードの OS/2 には、最大 64KB のメモリ領域のベース アドレスを保持するセグメント レジスタがあります。別のメモリ領域には別のベースアドレスがあり、ユーザーモードコードはベースアドレスをまったく取得できないため、ポインターを減算/加算して領域の外に出ても、「場所を知る」方法はありませんあなたは"。
ほとんどの (現在) 一般に利用可能なアーキテクチャでは、システム内の任意のアドレスに対して計算を行うことは問題なく機能しますが、標準によって保証されているわけではありません。
ポインタ演算はここで説明されています::
ありがとうございました
:::::: もう少し説明 :::::::::
ポインタと整数は交換できません。(0 を除く。) ポインターと整数の間の演算と、2 つのポインターの間の演算を別々に処理する必要があります。
long へのポインタがあるとします。
long *ptrlng;
ポインタと整数の間の二項演算
1. ptrlng+n is valid, if n is an integer. The result is the following byte address
ptrlng + n*sizeof(long) and not ptrlng + n.
It advances the pointer by n number of longs.
2 ptrlng-n is similar.
同じタイプのデータを指す 2 つのポインター ptr1 と ptr2 を考えてみましょう。
<datatype> *ptr1, *ptr2;
2 つのポインタ間の二項演算
1.Surprise: Adding two pointers together is not allowed!
2.ptr1 - ptr 2 is allowed, as long as they are pointing to elements of the same array.
The result is
(ptr1 - ptr2)/sizeof(datatype)
In other settings, this operation is undefined (may or may not give the correct answer).
なぜこれらすべての特殊なケースがあるのでしょうか? ポインター演算のこれらの規則は、配列内のアドレス指定を正しく処理することを目的としています。
ポインターを別のポインターから減算できれば、すべての関係演算をサポートできます。
ポインターの論理操作
1. ptr1 > ptr2 is the same as ptr1 - ptr2 > 0,
2. ptr1 = ptr2 is the same as ptr1 - ptr2 = 0,
3. ptr1 < ptr2 is the same as ptr1 - ptr2 < 0,
4. and so on.
お役に立てれば。