配列ポインタ配列が配列の違いを指す

2797 ワード

  : 

一、配列ポインタとポインタ配列
配列ポインタはこの配列のヘッダアドレスを指すポインタであり、オブジェクトを指すのはこの配列である. 
ポインタ配列はポインタを格納する配列であり、この配列の各要素はポインタである.例:int a[10];  int* s;  s = a;//ここでsは配列ポインタであり、その値は配列aのヘッダアドレスである.もちろん、aが整数であれば、sは整数を指すポインタである.  int a;  int* s[5]; 
for(int i=0;i<5;i++)s[i]=a;//ここでsはポインタ配列であり、その各要素は整数変数aのアドレスである.
間違えやすいところ:
1.                   ; int (*p)[];
2.    :                   ,           。  int *p[];

例:
typedef int type;
type *p[3]; //    ,    type     :  type*
type(*p)[3]; //         type       ,     。

type & vRef[3]; //     ,      type&   。
type (&vRef)[3]; //     ,     type   
int a[3][4]       。
int (*p)[4]    int p[][4],            ,           4     。 a       ,        。
p=a;
int *p[3]     。   ,         ,   p[0],p[1],p[2]。           。
int a1,a2,a3;
p[0]=&a1;
p[1]=&a2;
p[2]=&a3; 

二、行ポインタ
二次元配列用のもの例えばa[5][5]a[0]が行ポインタでありa[0]の行であるこの一次元配列のヘッダアドレスつまりa[0]のアドレスとa[0][0]のアドレス、そしてaが同じアドレスであるa[0]が{a[0][0]、a[0][1]、a[0][2]、a[0][3]、a[0][4]}この配列のヘッダアドレスa[0]+1が次の行aを指す[1]場合メンバーの各ポインタは1次元配列を指します
では、行ポインタ(JAVAのような2次元配列は、多次元配列でこのように構成されているようです)と理解できます.
三、定義
配列ポインタ(行ポインタとも呼ばれる)定義int(*p)[n];()優先度が高く、まずpがポインタであり、整数の1次元配列を指し、この1次元配列の長さはnであり、pのステップ長とも言える.すなわち,p+1を実行する場合,pはn個の整数データの長さにまたがる.
2 D配列をポインタに割り当てるには、int a[3][4];int (*p)[4];//この文は、4つの要素を含む1次元配列を指す配列ポインタを定義します. p=a;//この2次元配列のヘッダアドレスをp、すなわちa[0]または&a[0][0]p++に割り当てる.//この文が実行された後、すなわちp=p+1である.p跨過行a[0][]は行aを指す[1][]
したがって、配列ポインタは1次元配列を指すポインタとも呼ばれ、行ポインタとも呼ばれます.
ポインタ配列定義int*p[n];[]優先度が高く、pと結合して配列になり、int*によってn個のポインタタイプの配列要素を持つ整数ポインタ配列であることが説明されます.ここでp+1を実行するのはエラーであり、このように値を付与するのもエラーである:p=a;pは不可知な表現なので、p[0]、p[1]、p[2]...p[n−1]であり、これらはそれぞれポインタ変数であり、変数アドレスを格納するために使用することができる.しかし、このように*p=a;ここで*pはポインタ配列の最初の要素の値,aのヘッダアドレスの値を表す.2 D配列をポインタ配列に割り当てるには、int*p[3];int a[3][4]; for(i=0;i<3;i++) p[i]=a[i]; ここでint*p[3]は、1次元配列内に3つのポインタ変数が格納されていることを示し、それぞれp[0]、p[1]、p[2]であるため、それぞれ値を付与する.
このように両者の違いは、メモリ内のポインタの記憶空間を占有する2次元配列を指すポインタ変数にすぎない.ポインタ配列は複数のポインタ変数であり,配列形式でメモリに存在し,複数のポインタの記憶空間を占有する.また、2 D配列を指すときに使用される参照と配列名で参照は同じです.例えば配列中のi行j列の要素を表す:*(p[i]+j)、*(*(p+i)+j)、(*(p+i)[j]、p[i][j]
 
優先度:()>[]>*