さらにポインタ


命令=アドレス値+データ値.ポインタは、データを指すアドレス番号であり、そのアドレスのデータ値です.したがってポインタは命令によく対応し,アドレス演算を行い,アドレス上のデータ値を取得することができる.
実際のプログラミングで明確にしなければならない概念:
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特性;ポインタの遊離状態は,前回まで追跡され,コードの論理的難易度が増加した.