2016-04-10 20 views
-2

まったく同じスレッドがたくさんあることは知っていますが、それらは私を満足させません。 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 "はありませんか?

初心者にとってはよくある問題ですが、妥当で満足できる説明をしたいと思います。助けてくれてありがとう:

+0

については

'intが**' 2次元配列ではなく、ので - あなたはすでに述べたように - 「ポインタへのポインタ」。ポインタは配列ではなく、その逆もあります。 – Olaf

+0

@Olafしかし、 '* arr'、' *(arr + 1) 'などが配列の実際の整数を指すポインタを指していれば、' arr'は整数へのポインタになっていませんか? – Glaeqen

+2

なぜ人々は 'array [i] [j]'の代わりに '(*(*(array + i)+ j))'を書くのですか? –

答えて

2

あなたの "私は知っている"セクションはすべて間違っています。あなたは実際に1次元配列を正しく理解していなかったので、2次元の場合にはあなたのためには機能しませんでした。

int arr[5][5]は、であり、メモリ内で連続するintオブジェクトです。ポインタはありません。

arrおよび*arrは、配列であることを示します。 arr == *arrarr+1 == *(arr+1)は両方とも型の不一致があり、コンパイルに失敗します。 int **は「int *へのポイント」を意味するので

int **はここに適用することはできません、しかしint[5][5]に保存されているいかなるint * sがありません。

int (*arr)[C]は、「int[5]を指している」ことを意味します。 int[5][5]にはint[5]が存在するので、あなたはそれを指すことができます。さらに読書C FAQ on arrays and pointers

+0

人々はしませんこの "配列のすべてをポインタとする"ナンセンスgo ...: '( –

関連する問題