一般的に使用されるインジケータ変数は、次のとおり、変数割り当て、最後の参照ポインタ変数へのポインタを、ポインタ変数を定義します。次のように説明する:
インジケータ変数の(1)の定義
定義された変数の文はint * P、* P1、* Q; 変数は*ポインタ変数が定義されています。したがって、声明は、pという名前の3つの整数ポインタ変数、QとP1を定義します。ポインタ変数は、変数のアドレスを格納するために使用され、アドレスは、一般的に4バイト、4バイトのポインタ可変長であるためです。
ポインタ変数の割り当て(2)
ポインタ変数は、この乱数が、システムのアドレス領域である場合、ポインタ変数のシステムは、エリアメモリセル代入演算子と呼ば、乱数である定義された後、システムは、セル領域の内容を変更しますこれは、システムの崩壊につながる可能性があります。だから、ポインタの後に変数の定義は、アドレス0または変数を割り当てる必要があります。
上記の例から分かるように、3例でポインタ変数に初期値:
最初のケースは、アドレス演算子「&」変数のアドレスポインタ変数に代入されます。:P =&;
後者の場合、変数は以下のような別のポインタ変数に割り当てられたアドレスへのポインタである:P1 = P;
第三のケースはQ = 0としてポインタ変数NULL値0に割り当てられる。表しますポインタは、任意の変数の変数を指していません。
割り当て後、ポインタ変数p、P1点変数aに、qは図7.2に示されている、任意の細胞を指していません。
参照(3)ポインタ変数
ポインタ変数は実現するために、ポインタ演算子「*」で参照されます。上記の例では、* P * P1、変数で表され、したがって、第一の出力COUT << * P文が実行され、出力100は、変数の内容です。代入文が* P1 = 200; P1間接ポインタ変数データ200を介して変数に割り当てられ、従って、第二出力文、200の変数割り当ての内容を、* P、* P1。
(4)ポインタ変数を初期化
初期値ポインタ変数を定義するときにポインタ変数は、上記の例通常の変数と同じであってもよい、定義文ポインタ変数pのように書くことができる:INT * P =&。
インジケータ変数の(1)の定義
定義された変数の文はint * P、* P1、* Q; 変数は*ポインタ変数が定義されています。したがって、声明は、pという名前の3つの整数ポインタ変数、QとP1を定義します。ポインタ変数は、変数のアドレスを格納するために使用され、アドレスは、一般的に4バイト、4バイトのポインタ可変長であるためです。
ポインタ変数の割り当て(2)
ポインタ変数は、この乱数が、システムのアドレス領域である場合、ポインタ変数のシステムは、エリアメモリセル代入演算子と呼ば、乱数である定義された後、システムは、セル領域の内容を変更しますこれは、システムの崩壊につながる可能性があります。だから、ポインタの後に変数の定義は、アドレス0または変数を割り当てる必要があります。
上記の例から分かるように、3例でポインタ変数に初期値:
最初のケースは、アドレス演算子「&」変数のアドレスポインタ変数に代入されます。:P =&;
後者の場合、変数は以下のような別のポインタ変数に割り当てられたアドレスへのポインタである:P1 = P;
第三のケースはQ = 0としてポインタ変数NULL値0に割り当てられる。表しますポインタは、任意の変数の変数を指していません。
割り当て後、ポインタ変数p、P1点変数aに、qは図7.2に示されている、任意の細胞を指していません。
参照(3)ポインタ変数
ポインタ変数は実現するために、ポインタ演算子「*」で参照されます。上記の例では、* P * P1、変数で表され、したがって、第一の出力COUT << * P文が実行され、出力100は、変数の内容です。代入文が* P1 = 200; P1間接ポインタ変数データ200を介して変数に割り当てられ、従って、第二出力文、200の変数割り当ての内容を、* P、* P1。
(4)ポインタ変数を初期化
初期値ポインタ変数を定義するときにポインタ変数は、上記の例通常の変数と同じであってもよい、定義文ポインタ変数pのように書くことができる:INT * P =&。
7.1.3ポインタ変数計算
代入演算子、関係演算と算術:3つの方法で操作ポインタ変数。
1。ポインタ変数代入演算子
ポインタ変数代入演算子は、ポインタ変数の変数のアドレスであり、部分が導入され、代入演算子ポインタ変数の読者の理解を深め、他の例です。
[実施例7.2]は3つの整数の変数A1、A2、A3、A3 = A1 + A2動作完了ポインタ変数を定義します。再定義二つの実変数B1、B2、ポインタ変数の操作B1 + B2が完成されます。
含める#<、でiostream.h>
ボイドメイン(ボイド)
{int型= A1 1、A2 = 2、A3;
int型P1の*、P2 *、P3 *;
フロート= 12.5 B1、B2 = 25.5;
フロート* FP1、FP2 *。
P1 =&A1;
P2 =&A2;
P3 =&A3;
* P3 = * P1 + * P2;
FP1 =&B1;
FP2 =&B2;
COUT << "*のP1 =" << * P1 << '\のT' << " = P2 * "* P2 << << '\のT' <<" P1 * + P2 * =「* P3 << << '\ N-';
COUT <
裁判所未満<< "B1 =" << * FP1 << '\ tの' << "B2 = "<< * FP2 << '\ tの' <<" B1 + B2 =" << * FP1 + * FP2 <<」 \ n 'は、
}
実行後、出力:
* P1 = 1 * P2 = 2 * P1 + * P2 = 3。
A1 = 1 A2 = 2 A1 + A2 = 3。。
B1 = 12.5 B2 = 25.5 B1 + B2 = 38である
ポインタ変数の後に、本実施形態では割り当て動作の後、整数ポインタ変数P1、P2、P3変数A1を指し、A2、A3、したがって、* P1 = A1 * P2 = A2 * P3 = A3。したがって、* P3 = P1 * + * P2の操作は、操作A3 = A1 + A2です。図7.3(a)は、図1に示します。
* P1 = 1 * P2 = 2 * P1 + * P2 = 3。
A1 = 1 A2 = 2 A1 + A2 = 3。。
B1 = 12.5 B2 = 25.5 B1 + B2 = 38である
ポインタ変数の後に、本実施形態では割り当て動作の後、整数ポインタ変数P1、P2、P3変数A1を指し、A2、A3、したがって、* P1 = A1 * P2 = A2 * P3 = A3。したがって、* P3 = P1 * + * P2の操作は、操作A3 = A1 + A2です。図7.3(a)は、図1に示します。
2。ポインタ変数算術
算術主ポインタ変数ポインタ変数は、NプラスとマイナスN操作。インクリメントおよびデクリメントされます。
(1)ポインタ変数からの操作追加
命令フォーマット:<ポインタ変数> ++;
追加操作からポインタ変数は、ポインタ変数を計算する値を追加しないが、ポインタ変数は、計算の次の要素を指すように。コンピュータが実行すると、<ポインタ変数> ++命令ポインタ変数、すなわちバイト・ポインタ変数の型、数の実際の増加である。<ポインタ変数> = <ポインタ変数> +のsizeof(<ポインタ変数の型>)。図7.4に示すように、アレイ1000の最初のアドレスを考えます。
INT * P =&[0 ]; // P = 1000、 [0]の要素を指す
のp ++;
ポインタ変数pに第1のアドレスアレイ1000の最初の文、P = 1000となるよう。P-追加操作から作られた第二のステートメント:
P = P +はsizeof(INT)= P + = 1004 4、点Pとなるよう次の要素[1]。
のp ++;
ポインタ変数pに第1のアドレスアレイ1000の最初の文、P = 1000となるよう。P-追加操作から作られた第二のステートメント:
P = P +はsizeof(INT)= P + = 1004 4、点Pとなるよう次の要素[1]。
(2)ポインタ変数デクリメント
命令フォーマット:<ポインタ変数> -と、
デクリメントポインタ変数は、コンピューティング要素を指すようにポインタ変数です。-コンピュータが実行するときに<ポインタ変数>命令ポインタ変数、すなわちバイトタイプの実際の数、低減するポインタ変数である
<ポインタ変数> = <ポインタ変数> -sizeof(<ポインタ変数の型>)を
追加操作とデクリメントからはポスト動作もフロントもできます。
(3)ポインタ変数は、n算術インクリメントされる
命令フォーマット:<ポインタ変数> = <ポインタ変数> + nは、
n個の要素の次の計算を指すようにポインタ変数が操作ポインタ変数nを加えます。:コンピュータに実行<ポインタ変数> + N命令ポインタ変数、すなわちポインタ変数の型がn倍されたバイト数の実際の増加であり、
N * <ポインタ変数> = <ポインタ変数> +のsizeof(<ポインタ変数の型>)
(4)ポインタ変数n保存操作
命令フォーマット:<ポインタ変数> = <ポインタ変数> -n;
保存動作Nポインタ変数は、n個の要素の計算を指すようにポインタ変数です。-コンピュータが実行するときに<ポインタ変数が> N実際の還元型ポインタ変数のバイトの命令ポインタ変数番号の後、すなわちN、乗算され
、N * <ポインタ変数> = <ポインタ変数> -sizeof(<ポインタ変数の型>)
[実施例7.3]ポインタ変数、減算、加算、および減算N N操作から添加しました。図7.4に示すように、アレイ1000の最初のアドレスを考えます。
命令フォーマット:<ポインタ変数> -と、
デクリメントポインタ変数は、コンピューティング要素を指すようにポインタ変数です。-コンピュータが実行するときに<ポインタ変数>命令ポインタ変数、すなわちバイトタイプの実際の数、低減するポインタ変数である
<ポインタ変数> = <ポインタ変数> -sizeof(<ポインタ変数の型>)を
追加操作とデクリメントからはポスト動作もフロントもできます。
(3)ポインタ変数は、n算術インクリメントされる
命令フォーマット:<ポインタ変数> = <ポインタ変数> + nは、
n個の要素の次の計算を指すようにポインタ変数が操作ポインタ変数nを加えます。:コンピュータに実行<ポインタ変数> + N命令ポインタ変数、すなわちポインタ変数の型がn倍されたバイト数の実際の増加であり、
N * <ポインタ変数> = <ポインタ変数> +のsizeof(<ポインタ変数の型>)
(4)ポインタ変数n保存操作
命令フォーマット:<ポインタ変数> = <ポインタ変数> -n;
保存動作Nポインタ変数は、n個の要素の計算を指すようにポインタ変数です。-コンピュータが実行するときに<ポインタ変数が> N実際の還元型ポインタ変数のバイトの命令ポインタ変数番号の後、すなわちN、乗算され
、N * <ポインタ変数> = <ポインタ変数> -sizeof(<ポインタ変数の型>)
[実施例7.3]ポインタ変数、減算、加算、および減算N N操作から添加しました。図7.4に示すように、アレイ1000の最初のアドレスを考えます。
含める#<、でiostream.h>
ボイドメイン(ボイド)
{INT [5] = {0,1,2,3,4};
INT * P;
P =&[0]; // Pを指すように[0] 、P = 1000
P ++; [1]、P = 1004要素の// P点
//出力[1] 1つのコンテンツ、COUT * P << << '\のT'。
P = P + 3、三つの要素A [4]、P = 1016 // P点
//出力A [4] 4コンテンツ、COUT * P << << '\のT'。
P--; [3]、P = 1012上の素子へ// P点
COUT * P << << '\のT'; //コンテンツ出力[3] 3。
P = P-3;三つの要素[0]、P = 1000 // P点
COUT * P << << '\のT'; // [0] 0コンテンツを出力します。
}
:プログラム実行出力後
1430
上記の例からは、ポインタ変数に加算および減算演算によって、変数を達成することができることがわかるn個の要素アップユニットのn個の要素またはユニットの次のオブジェクトへのポインタのポイントを移動します。
3。リレーショナル演算子は、変数ポインタ
関係演算子ポインタ変数は、ポインタ可変サイズの比較値、すなわち、2つの比較変数のアドレスポインタ、メインアレイ素子を判断します。
関係演算子ポインタ変数は、ポインタ可変サイズの比較値、すなわち、2つの比較変数のアドレスポインタ、メインアレイ素子を判断します。
[実施例7.4] 1 -次元ポインタと変数を使用して実際の配列要素、およびアレイの各素子の出力値、および配列を、そして。
含める#<、でiostream.h>
ボイドメイン(ボイド)
INT {= {1,2,3,4,5} [5];
int型* P、* P1、
P1&A = + +1 [4];
(P用P <P1 ;; =&A [0] P ++)
COUT << * P << '\のT';
int型のSUM = 0;
P =&A [0];
!一方(P = P1)SUM + = * P ++;
COUT < ; < "\ N-SUM =" SUM << << ENDL
}
出力:プログラムを実行した後
1 2 5 4 3。
SUM = 15
アレイのプログラム最初の端部が、図7.4に示すアドレス+1 P1を割り当てられます。for文では、ポインタ変数pは、ループ変数、アレイ&[0] Pに割り当てられているの最初のアドレスです。第1の循環ループ制御変数pおよびアドレスを比較P1は、P <P1の場合、* P方式は、出力配列要素[i]の値を置き、そして次の要素にP点から添加します。p≥p1までこのループ。
P = P1、合計=合計+ * Pながら、while文では、それはまだ、ループ制御変数pとして使用されている!;
4。優先順位との混合演算ポインタ演算子
(1)オペレータ*右から左への方向に合わせた優先アドレス演算子&同じ、へのポインタ。
変数定義文で:、* p =&INT ;
表現:* P&評価順序は、 "&"の後に"*"最初である、すなわち、&(* P)=&A = P。
式: "&"最初のための&A *後の評価のため、 "*"、すなわち、*(&A)= * P =。
(2)「++」が、 -同じ、「*」、「&」右から左への方向に合わせた優先度「」これは、例を挙げて説明します。変数定義文で:
INT [4] = {100,200,300,400}、B、
INT * P =&[0];
便宜上、アレイ1000の最初のアドレスに割り当てられたシステムは、図7.4に示されていると仮定する。
①B = * P ++;
プレス右から左への原則を結合して、式は"*"、* P ++シス-一次"+"を評価し、それは次のようになります*(P ++)。「+」のp ++演算子の後にポストがあるので、実際の操作は、発現* p値を取ることです、のp ++以来の操作後に追加。その代入式b = * P ++、次の2つの文に相当する:
B = P *; P = // * B = A [0] = 100
P ++; // P + P =はsizeof(INT)= 1004
最終動作結果は、B = 100であります [1]〜P = 1004点。
②B = * ++のp;
右から*表現++の組み合わせの原理に従って、左Pの評価順序に「+」最初の後に、「*」、つまり:*(++ P)。P ++フロント用++オペレータので、自己表現の実際の動作の前に取った後、* p値++ Pの操作に追加されているからです。:次の2つの文に相当する;その割り当て発現B = * ++ P
[2]を指し、P = P + //のsizeof(INT)= 1008; ++ P
B = P *; * // B = P = [2] 300 =
最後の操作は、[2]〜B = 300、P = 1008点となります。
=(* P)++③B ;
括弧内の優先動作するので、(すなわち、[2])を除去するための発現* P及びBの値、* pのその値、すなわち、[2]のコンテンツを割り当てプラス1。したがって、次の二つの式に相当する文:
B = P *; // B = A [2] = 300
A [2] ++; = 301 1 // A [2] = + 300
④* B =(P ++ );
式*のP ++、で演算結果と同等である①から分かる:
B = P *; // B [2] = 301 =
P ++;を指す// P + P =はsizeof(INT)= 1012、 [3]
⑤B ++ = * P;
* pの値を除去するために、次に"+"演算子、すなわち、最初の表現"*"演算子は、値がインクリメントされます。したがって、次式が実際に実行される操作:B = ++(* P) = ++ [3] = 400 + 1 = 401; pは、 [3]不変を指しています。
次のように各文章例の上記の説明は、要約されています。
括弧内の優先動作するので、(すなわち、[2])を除去するための発現* P及びBの値、* pのその値、すなわち、[2]のコンテンツを割り当てプラス1。したがって、次の二つの式に相当する文:
B = P *; // B = A [2] = 300
A [2] ++; = 301 1 // A [2] = + 300
④* B =(P ++ );
式*のP ++、で演算結果と同等である①から分かる:
B = P *; // B [2] = 301 =
P ++;を指す// P + P =はsizeof(INT)= 1012、 [3]
⑤B ++ = * P;
* pの値を除去するために、次に"+"演算子、すなわち、最初の表現"*"演算子は、値がインクリメントされます。したがって、次式が実際に実行される操作:B = ++(* P) = ++ [3] = 400 + 1 = 401; pは、 [3]不変を指しています。
次のように各文章例の上記の説明は、要約されています。
【例7.5】指针运算符"*"、 "&"、 "++"优先级与结合律示例。
#含める<でiostream.h>
メイン()
{[4] = {100,200,300,400}、bはint型、
INT * P =&[0]。
coutの<< '\ tの' << "P =" << P <<てendl;
B = * P ++;
裁判所未満<< "B =" << B << '\ tの' << "P =" << P <<てendl;
B = * ++のp;
裁判所未満<< "B =" << B << '\ tの' << "P =" << P <<てendl;
B =(* P)++;
裁判所未満<< "B =" << B << '\ tの' << "P =" << P <<てendl;
B = *(P ++);
裁判所未満<< "B =" << B << '\ tの' <<
0x0065FDF4 = 301 = P B
B P = 0x0065FDF4 = 401
の説明:配列定義、データアドレスが動的にオペレーティング・システムの記憶管理によって割り当てられ、従って、配列aのアドレスが不明である、各演算の結果でありますそれは異なる場合があります。一般的に16進数で表現しました。本実施形態では、アレイシステムの最初のアドレスが0x0065FDE8に割り当てられます。図7.4は、読者の便宜のために1016年から1000年のようなアドレスを想定しています。
#含める<でiostream.h>
メイン()
{[4] = {100,200,300,400}、bはint型、
INT * P =&[0]。
coutの<< '\ tの' << "P =" << P <<てendl;
B = * P ++;
裁判所未満<< "B =" << B << '\ tの' << "P =" << P <<てendl;
B = * ++のp;
裁判所未満<< "B =" << B << '\ tの' << "P =" << P <<てendl;
B =(* P)++;
裁判所未満<< "B =" << B << '\ tの' << "P =" << P <<てendl;
B = *(P ++);
裁判所未満<< "B =" << B << '\ tの' <<
0x0065FDF4 = 301 = P B
B P = 0x0065FDF4 = 401
の説明:配列定義、データアドレスが動的にオペレーティング・システムの記憶管理によって割り当てられ、従って、配列aのアドレスが不明である、各演算の結果でありますそれは異なる場合があります。一般的に16進数で表現しました。本実施形態では、アレイシステムの最初のアドレスが0x0065FDE8に割り当てられます。図7.4は、読者の便宜のために1016年から1000年のようなアドレスを想定しています。
ます。https://www.cnblogs.com/kungfupanda/archive/2011/11/29/2267825.htmlで再現