さらにポインタ
命令=アドレス値+データ値.ポインタは、データを指すアドレス番号であり、そのアドレスのデータ値です.したがってポインタは命令によく対応し,アドレス演算を行い,アドレス上のデータ値を取得することができる.
実際のプログラミングで明確にしなければならない概念:
1.*,&宣言はすべてアドレスです;ただし、式中*はaddr上のDataを取得する、&Dataを取得するAddrである.
2.ポインタは文字列の特性を処理し、ポインタは1つの文字列またはポインタ配列に1列の配列を格納することができる.
動的に表現されるため、2 Dのポインタ配列には要素列アドレスを配置できます.**ppはdataです.char**pは1次元の付与値がシーケンス列に与えられ、多次元の指向addrとdataが要求に合致すればよい.
3.ポインタの付与研究:通常指向、配列割り当て、malloc/new割り当て.
ポインタの種類、初期化は、いずれもメモリのアドレスユニットに対する制限である.
3.1. newでメモリを割り当てない:アドレスを指し、*pではなくp 1で操作し、他の変数で値を割り当てた後、単一のpと*pで操作することができます.同じアドレスであれば任意に渡して指すアドレスdeleteを落とすことができます.Delete p1;(int const*p;int*const p;定数ポインタp操作、ポインタ定数*p操作);
3.2. p 1は配列a[10]を指し、連続する空間を割り当てるものであり、p 1++操作を行ってもよいし*(p 1+3)すなわちp 1[3]操作を行ってもよい.Delete []p1;
3.3. malloc/newでメモリを割り当てる:通常のポインタ(定数ポインタでもポインタ定数でもない)に割り当てられたメモリにバンドルし、q++操作ではなく*q操作を行う離散的な空間を申請する.
4.定数ポインタ/関数ポインタ/配列ポインタ/、ポインタ定数/ポインタ関数/ポインタ配列.
外部(カッコを付けて独立した別のアドレスの変数):定数を指すポインタ、クラス関数を指すポインタ(抽象的なインタフェース)、次元配列を指すポインタ(1次元増加);内部:本質はポインタの定数であり、戻りはポインタの関数であり、要素はポインタの配列である.宣言:
例えば:{int a[4][5];int(*p)[5]=a;}ここでaは2次元配列の配列名であり、1つの2次ポインタ定数に相当する.pは5つのint要素を含む1次元配列を指すポインタ変数であり、このときpの増分は1次元配列の長さ単位である.p+iは2次元配列aのi行の先頭アドレスであり、*(p+2)+3はa配列2行3列の要素アドレス(第1行0行、第1列0列)を表し、*(*(p+2)+3)はa[2][3]の値を表す.
まとめ:配列ポインタは内部構造を指し、外側で1つの次元を抽象化し(線形p++操作のため)、この次元の長さは不定である(決定するには値を付与する).4.ポインタの難点:ポインタの本質的なaddrとdata特性;ポインタの遊離状態は,前回まで追跡され,コードの論理的難易度が増加した.
実際のプログラミングで明確にしなければならない概念:
1.*,&宣言はすべてアドレスです;ただし、式中*はaddr上のDataを取得する、&Dataを取得するAddrである.
2.ポインタは文字列の特性を処理し、ポインタは1つの文字列またはポインタ配列に1列の配列を格納することができる.
動的に表現されるため、2 Dのポインタ配列には要素列アドレスを配置できます.**ppはdataです.char**pは1次元の付与値がシーケンス列に与えられ、多次元の指向addrとdataが要求に合致すればよい.
char *c[4]={“Jerome”,
“Cen”,
“Zhenzhu”,
“Ou”};
char **cp[4]=
{c+3,
c+2,
c+1,
c};
char ***ppp=p;
3.ポインタの付与研究:通常指向、配列割り当て、malloc/new割り当て.
ポインタの種類、初期化は、いずれもメモリのアドレスユニットに対する制限である.
3.1. newでメモリを割り当てない:アドレスを指し、*pではなくp 1で操作し、他の変数で値を割り当てた後、単一のpと*pで操作することができます.同じアドレスであれば任意に渡して指すアドレスdeleteを落とすことができます.Delete p1;(int const*p;int*const p;定数ポインタp操作、ポインタ定数*p操作);
3.2. p 1は配列a[10]を指し、連続する空間を割り当てるものであり、p 1++操作を行ってもよいし*(p 1+3)すなわちp 1[3]操作を行ってもよい.Delete []p1;
3.3. malloc/newでメモリを割り当てる:通常のポインタ(定数ポインタでもポインタ定数でもない)に割り当てられたメモリにバンドルし、q++操作ではなく*q操作を行う離散的な空間を申請する.
4.定数ポインタ/関数ポインタ/配列ポインタ/、ポインタ定数/ポインタ関数/ポインタ配列.
外部(カッコを付けて独立した別のアドレスの変数):定数を指すポインタ、クラス関数を指すポインタ(抽象的なインタフェース)、次元配列を指すポインタ(1次元増加);内部:本質はポインタの定数であり、戻りはポインタの関数であり、要素はポインタの配列である.宣言:
int const *data;// ,p
int *const data;//*p
int (*f)(int i,int j){};//
int *func (int i,int j){};//func=&funname1
int (*p)[6]; //*(p+1)+3
int *p[10];//p[2]+3
GroupValues*pValue=new GroupValues[count];// , data
配列ポインタをよりよく理解するために、通常のポインタおよび2次ポインタとの違いを例に挙げて説明する.例えば:{int a[4][5];int(*p)[5]=a;}ここでaは2次元配列の配列名であり、1つの2次ポインタ定数に相当する.pは5つのint要素を含む1次元配列を指すポインタ変数であり、このときpの増分は1次元配列の長さ単位である.p+iは2次元配列aのi行の先頭アドレスであり、*(p+2)+3はa配列2行3列の要素アドレス(第1行0行、第1列0列)を表し、*(*(p+2)+3)はa[2][3]の値を表す.
まとめ:配列ポインタは内部構造を指し、外側で1つの次元を抽象化し(線形p++操作のため)、この次元の長さは不定である(決定するには値を付与する).4.ポインタの難点:ポインタの本質的なaddrとdata特性;ポインタの遊離状態は,前回まで追跡され,コードの論理的難易度が増加した.