2016-07-09 8 views
-7

Ich habe diesen Code von meiner vorherigen Prüfung und es ist das erste Mal, dass ich diese *arr[] sehe. Was bedeutet das? Ist es eine Matrix oder ein Array? Und was enthält es?Was bedeutet * arr []?

#include <stdio.h> 
void f2(int **a, int x, int y); 
int main() 
{ 
    int m[3][4] = {{7,12,11,21 }, {20,1,2,3}, {33,42,11,50}}; 
    int *arr[] = { m[0], m[1], m[2] }; 
    f2(arr, 3, 4); 
    _getch(); 
    return 0; 
} 

void f2(int **a, int x, int y) 
{ 
    if (x > 0) 
    { 
    int i, j = 0, *p = a[x - 1]; 
    for (i = 0; i < y; i++) 
    { 
     if (!(p[i] % 3)) 
     printf("%d ", p[i]); 
    } 
    f2(a, x - 1, y); 
    } 
    else 
    printf("\n"); 
} 
+3

Das ist wirklich eine Anfängerfrage. Das können Sie auf den ersten Seiten eines anständigen C-Buches erfahren. –

+1

@ machine_1 oh wirklich wenn dich eine "Anfängerfrage" stört, kannst du es einfach ignorieren! – lasvegasnay

Antwort

1

Durch die Anweisung

int *arr[]; // int* arr[] is also true but stick on to one format. 

Sie ein Array von Zeigern auf Integer deklarieren.

Demystifying:

int m[3][4] = {{7,12,11,21 }, {20,1,2,3}, {33,42,11,50}}; 
  • m ist ein Array.
  • m[0], m[1], m[2] Punkte auf int[4]. Punkt # A
  • m[0][0] ist eine ganze Zahl.

Von Punkt #A es versteht sich, dass m[0], m[1], m[2] Zeiger sind.

Demystifying:

int *arr[] = { m[0], m[1], m[2] }; 
  • arr[0], arr[1] werden arr[2] zu m[0], m[1], m[2] jeweils zugeordnet.
  • m[1][2] entspricht arr[1][2].
+0

@alk: Habe ich gesagt, 'arr' hat einen Typ? Verzeih mir, ich habe dich nicht bekommen – sjsam

+1

Ich las "* declare *" als "* define *", was nicht dasselbe ist, sry. – alk

3

was bedeutet *arr[]?

Als eigenständiger Ausdruck ist *arr[] nicht gültig.

Für variable Definitionen gibt es zwei Bedeutungen hier, der je nach Kontext, in dem ein solcher Ausdruck erscheint:

  1. Variable Definition mit initialiser (gemäß Schnipsel des OP)

    int * arr[] = { m[0], m[1], m[2] }; 
    

    Dies definiert ein Array von Zeiger zu int, wobei die Anzahl der Elemente durch die Anzahl der Elemente in seiner Initialist bestimmt wird er. Im obigen Beispiel wird arr drei Elemente haben.

  2. Variable Definition innerhalb einer Parameterliste der Funktion

    Wenn wie wie folgt verwendet, das heißt in einer Funktionsdeklaration/definition

    void foo(int * arr[]); 
    

    es in der Tat definiert eine int **, ein Zeiger zu Zeiger zu int. Im Rahmen einer Funktionsdeklaration/-definition sind int * arr[] und int ** arr äquivalent, oder allgemeiner T*[] entspricht T**.

Um dies ausdrücklich zu erklären: In keine Fall int * arr[] keine int s definiert.

+0

ist es mit Zahlen gefüllt? wenn ja, was sind sie – lasvegasnay

+0

Größe von was? Die Anzahl der Elemente ist drei, wie durch die Initialisierer angezeigt. sizeof (arr) ist die Anzahl der Bytes in einem Zeiger. – nicomp

+0

@lasvegagnay "* it *": Wer? Die Elemente des Arrays? Ja, durch den vom Initialisierer angegebenen Wert: '{m [0], m [1], m [2]};' – alk

1

Die Linie

int *arr[] = { m[0], m[1], m[2] }; 

erklärt arr als ein Array von Zeigern auf int; Die Größe des Arrays wird durch die Anzahl der Initialisierer (3) bestimmt. Es ist dasselbe wie das Schreiben

int *arr[3]; 
arr[0] = m[0]; 
arr[1] = m[1]; 
arr[2] = m[2]; 

Jeder Initialisierer (m[0], m[1] und m[2]) ist eine 4-Element-Anordnung von int; Unter den meisten Umständen wird jedoch ein Ausdruck vom Typ "Array von T" in einen Ausdruck vom Typ "Zeiger auf T" umgewandelt ("Verfall"), und der Wert des Ausdrucks wird die Adresse des ersten Elements sein des Arrays ist, so dass die obige Linie

int *arr[] = { &m[0][0], &m[1][0], &m[2][0] }; 

Jedes Element in arr ist ein Zeiger auf einen int

Äquivalent, nicht ein Array von Int. Aufgrund der Funktionsweise von Array-Subscripting in C erhalten Sie arr[i][j] das gleiche Ergebnis wie m[i][j].