2

1 次元として定義されているのに、2 つのパラメーターを持つポインターの配列にアクセスできるのはなぜですか?

関数で多次元配列にアクセスするには、ポインターの配列を操作する必要があることはわかっていますが、2 つのパラメーターを使用してポインターの配列にアクセスできる理由がわかりません。

int a[m][l] { 1,2,3,4, 2,3,4,5, 3,4,5,6  }; //some matrices
int c[m][l];    
int *ap[m];  //array of pointers one-dimensional
int i,j;


for (i = 0; i < m; i++)  //passing the address of first element in each 
        ap[i] = a[i];    //colon of matrix to array of pointers

for (j = 0; j < m; j++)
        bp[i] = b[i];

dosomethingwithmatrix(ap[0], bp[0], m, l);



int* dosomethingwithmatrix(const int*ap[], int* bp[])
{
            cp[i][j] = ap[i][j] //accss the array of pointers with two parameters

}
4

4 に答える 4

2

また、C では、配列はポインターに崩壊すると言われています。

標準から (C99 6.3.2.1/3 - その他のオペランド - 左辺値、配列、関数指定子):

sizeof 演算子または単項 & 演算子のオペランドである場合、または配列の初期化に使用される文字列リテラルである場合を除き、「型の配列の配列」型を持つ式は、型「へのポインター」を持つ式に変換されます。配列オブジェクトの最初の要素を指し、左辺値ではない type''。

そう:

array[i] "decays" to pointer[i]
where pointer has the address of the [0]th element of array

そして、私たちはすでにそれを見たので:

p[i] == *(p + i)

ポインターにオフセットを追加するだけです。

ところで、足し算は交換可能で*(p + i) == *(i + p)あるため、次の驚くべき結果が得られることがあります。

3["hello world"]

は完全に有効な C 式です (そして に等しい"hello world"[3])。

于 2016-01-15T14:40:02.843 に答える
1

インデックス表記でポインターを逆参照できるためです。まず、インデックスを使用して要素 (ポインター) にアクセスします。これで、ポインターもインデックスを使用して逆参照できるようになりました。

それと間接演算子の等価性は次のとおりです。

pointer[i] == *(pointer + i);
于 2016-01-15T14:32:10.990 に答える
1

あなたの場合、ap[i][j]それは意味があるので許可されています。

データ型を確認してみましょう。

  • int *ap[m];ap配列ですint *。関数パラメーター の場合、int*ap[]intapへのポインターへのポインターです。

  • 次に、ap[k](前のポイントを参照して)はint *です。これには、複数の への有効なアクセスを提供できるメモリが割り当てられている可能性がありますint

  • 十分なメモリap[k][s]が割り当てられている場合、int.

于 2016-01-15T14:34:17.530 に答える
0

パラメータapbp関数の両方dosomethingwithmatrixint へのポインタへのポインタです。それらはポインターの配列ではありません。関数宣言子

int* dosomethingwithmatrix(const int *ap[], int *bp[])  

と同等です

int* dosomethingwithmatrix(const int **ap, int **bp)
于 2016-01-15T14:33:20.690 に答える