まったく同じスレッドがたくさんあることは知っていますが、それらは私を満足させません。 1dアレイは理解しやすい。例えばを渡す。関数へのポインタとしてのnD配列の受け渡し
void printArray(int **array){...
void genRandArray(int **array){...
私は配列が実際にどのように動作するか分からない。私はそのようにint型へのポインタへのポインタを使用することはできませんなぜ
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define R 5
#define C 5
#define RANGE 500
void printArray(int (*)[C]);
void genRandArray(int (*)[C]);
void main(void){
int arr[R][C];
genRandArray(arr);
printArray(arr);
}
void printArray(int (*array)[C]){
for(int i=0; i<R; i++){
for(int j=0; j<C; j++){
printf("Array[%d][%d]/[%p] = %d\n", i, j, (*(array+i)+j), (*(*(array+i)+j)));
}
}
}
void genRandArray(int (*array)[C]){
static int initRand = 0;
if(!initRand){
srand(time(NULL));
initRand = 1;
}
for(int i=0; i<R; i++){
for(int j=0; j<C; j++){
*(*(array+i)+j)=rand()%RANGE;
}
}
}
:私は以下のソリューションを使用し機能するために2次元配列。 など。私は、静的配列を初期化..:
int arr[5][5];
はその後、私が知っている:
arr -> points to very first element of an array,
*arr -> points to first element of the "subarray", where one subarray is one row,
arr equals *arr;
(arr+1) equals *(arr+1);
のように。もし私が((arr + i)+ j)の値を得ることができたら、なぜ関数の引数として** arrを渡すことができないのですか?
(*(ARR + 1))[3] < =>((ARR + 1)+3)=>なぜ関数の引数 "INT(* ARR)[C]" *正しいと「intで* arr "はありませんか?
初心者にとってはよくある問題ですが、妥当で満足できる説明をしたいと思います。助けてくれてありがとう:
については
'intが**' 2次元配列ではなく、ので - あなたはすでに述べたように - 「ポインタへのポインタ」。ポインタは配列ではなく、その逆もあります。 – Olaf
@Olafしかし、 '* arr'、' *(arr + 1) 'などが配列の実際の整数を指すポインタを指していれば、' arr'は整数へのポインタになっていませんか? – Glaeqen
なぜ人々は 'array [i] [j]'の代わりに '(*(*(array + i)+ j))'を書くのですか? –