Wenn Sie ein Array in C ++ übergeben, werden diese als Zeiger übergeben. Wir müssen also die Größe dieses Arrays explizit übergeben.

// This will not work.
int GetSize(int* arr){
  return sizeof(arr)/size(int);
}

Wenn wir jedoch keine Funktion verwenden, um ihre Größe zu ermitteln, und "sizeof" in derselben Funktion verwenden, in der das Array initialisiert wurde, erhalten wir jetzt das richtige Ergebnis.

int main(){
  int arr[5];
  int size = sizeof(arr)/sizeof(int);
  cout << size << endl;
}

Ist es für mich also angemessen, das Array als eine Klasse mit einem Zeiger, seiner Größe und Art der darin enthaltenen Elemente zu betrachten?

Jetzt, wo ich darüber nachdenke, bin ich mir nicht sicher, woher C ++ die Größe des Arrays im letzteren Code kennt, wenn es nur wie ein Zeiger behandelt wird.

0
Humble Thinker 19 Feb. 2020 im 21:11

4 Antworten

Beste Antwort

Ist es für mich also angemessen, das Array als eine Klasse mit einem Zeiger, seiner Größe und Art der darin enthaltenen Elemente zu betrachten?

Nein, weil es nicht so ist. Ein Array im C-Stil ist nur ein Teil zusammenhängender Speicherelemente eines bestimmten Typs, nicht mehr und nicht weniger.

Jetzt, wo ich darüber nachdenke, bin ich mir nicht sicher, woher C ++ die Größe des Arrays im letzteren Code kennt, wenn es nur wie ein Zeiger behandelt wird.

So werden Arrays nicht behandelt.

In Ihrem ersten Beispiel akzeptiert die Funktion nur einen Zeiger. Es ist egal, woher dieser Zeiger stammt. Durch die Übergabe eines Arrays wird das Array in einen Zeiger auf das 1. Element zerlegt. Alle Größeninformationen gehen verloren und die Größe des Arrays kann nicht allein anhand des Zeigers bestimmt werden. Deshalb funktioniert sizeof(arr) in diesem Kontext nicht. Es kennt nur die Größe des Zeigers selbst, nicht die Größe des Arrays, von dem der Zeiger stammt.

In Ihrem zweiten Beispiel befindet sich das eigentliche Array in dem Bereich, in dem sizeof() verwendet wird. Der Compiler kennt die Deklaration des Arrays, sodass sizeof(arr) die tatsächliche Bytegröße des Arrays kennen kann.

Wenn Sie die Größe eines übergebenen Arrays in einer Funktion wirklich kennen und die Größe nicht explizit als Parameter übergeben möchten, übergeben Sie das Array als Referenz statt als Zeiger , damit die Größe des Arrays nicht verloren geht:

template<size_t N>
int GetSize(int (&arr)[N]){
  return N;
}
2
Remy Lebeau 19 Feb. 2020 im 18:52

Die Erklärung

int *arr; // arr = ptr to int

Ist anders als die Erklärung

int arr[5];  // arr = base ptr to array of 5 ints

Beachten Sie, dass arr jeweils in eine Adresse (ptr) aufgelöst wird. Im zweiten Fall kann der Compiler jedoch auflösen, dass arr ein Basis-ptr für ein Array von 5 int ist. Etwas schwieriger wird es, wenn die zweite Deklaration für einen Funktionsparameter gilt:

void foo(int arr[5]) { ... }

Dann ist das wirklich nicht anders als

void foo(int *arr) { ... }
void foo(int arr[]) { ... }

D.h. es wird nur ein ptr übergeben und sizeof(arr) gibt die Anzahl der Bytes in einem ptr zurück.

0
wcochran 19 Feb. 2020 im 18:27

Wie ich richtig verstehe, nehmen Sie im ersten Fall die Größe eines int * -Typs, der ein Zeiger auf int ist, und in den meisten Fällen ergeben sich 4 Bytes (abhängig von der Architektur und wahrscheinlich anderen Faktoren).

Im zweiten Fall verfügt der Compiler auch über alle Informationen, die zur Berechnung der Größe von (arr) erforderlich sind, da explizit 5 Elemente von int angegeben sind, wie durch int arr [5] definiert. und in den meisten Fällen entspricht dies 4 Bytes * 5 Elementen, 20 Bytes

0
Rixment 19 Feb. 2020 im 18:25
  1. Warum sizeof() im selben Bereich? - Weil der Compiler sieht, dass Sie int arr[5] deklariert haben, wird beim Kompilieren die Größe 5. sizeof() wird zur Kompilierungszeit berechnet.
  2. Warum funktioniert es nicht, wenn das Array als Zeiger übergeben wird? - Das liegt daran, dass ein Array hier in einen Zeiger zerfällt. Daher verliert es die Informationen der Größe. Tatsächlich gibt sizeof(arr) hier die Größe eines Zeigers auf Ihrem System an - 8 Byte für 64-Bit-Computer, 4 Byte für 32-Bit-Computer.
0
theWiseBro 19 Feb. 2020 im 18:48