2016-04-10 5 views
-2

Ich weiß, es gibt eine Vielzahl von Threads, die genau die gleichen sind, aber sie erfüllen mich nicht. 1d-Arrays sind leicht zu verstehen. Um z.B. 2d Array funktioniert ich die folgende Lösung verwenden:Übergabe von nD-Array als Zeiger auf die Funktion

#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; 
     } 
    } 
} 

Warum ich Zeiger nicht wie die in int verwenden kann, um den Zeiger:

void printArray(int **array){... 
void genRandArray(int **array){... 

Ich weiß nicht, wie Arrays tatsächlich funktioniert. Zum Beispiel I initialisiert statisch ein Array ..:

int arr[5][5]; 

Dann weiß ich, dass:

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); 

Und so weiter. Wenn ich den Wert von ( (arr + i) + j) bekommen kann, warum kann ich nicht ** Arr als Argument in Funktion übergeben?

(* (arr + 1)) [3] < =>( (arr + 1) + 3) => warum Funktionsargument "int (* arr) [C]" korrekt ist, und „int * * arr "ist nicht?

Ich weiß, es ist ein häufiges Problem für Neulinge, aber ich würde gerne vernünftige, zufriedenstellende Erklärung bekommen. Danke für die Hilfe :)

+0

Da 'int **' ist kein 2D-Array, aber - wie Sie bereits erwähnt - ein "Zeiger auf den Zeiger". Ein Zeiger ist kein Array oder umgekehrt. – Olaf

+0

@Olaf Aber wenn '* arr',' * (arr + 1) 'usw. auf einen Zeiger zeigt, der auf eine tatsächliche Ganzzahl im Array zeigt, macht das nicht' arr' einen Zeiger auf einen Zeiger auf eine Ganzzahl? – Glaeqen

+2

Warum schreiben die Leute '(* (* (array + i) + j))' anstelle von 'array [i] [j]' –

Antwort

2

Ihr "Ich weiß, dass" Abschnitt ist alles falsch. Sie haben ein 1-D-Array tatsächlich nicht richtig verstanden und der Versuch, in den 2-D-Fall zu gehen, funktionierte nicht für Sie.

int arr[5][5] ist 25 int Objekte im Speicher konsekutiv. Es gibt keine Zeiger.

arr und *arr sind Arrays, sie zeigen nicht. arr == *arr und arr+1 == *(arr+1) sind beide Typenkonflikte und können nicht kompiliert werden.

int ** kann hier nicht gelten, weil int ** bedeutet „Punkte zu int *“, aber es gibt keine int * in einer int[5][5] gespeichert s.

int (*arr)[C] bedeutet "zeigt auf int[5]". Es gibt eine int[5] in einer int[5][5], so dass Sie darauf hinweisen können.

Weitere C FAQ on arrays and pointers Lesen

+0

Menschen werden einfach nicht lass all das "Arrays sind Zeiger" Unsinn gehen ...: '( –

Verwandte Themen