C++ verwendet die Referenzmethode, um Arrays an Funktionen zu übergeben, um die Degeneration in Zeiger aufgrund der Übergabe von Funktionen zu vermeiden und die Größe von Arrays in Funktionen korrekt zu berechnen.

1. Problem

Wir wissen, dass, wenn wir ein Array als Parameter an eine Funktion übergeben, das Array zu einem Zeiger degeneriert. Dies verhindert, dass wir die Größe des Arrays in der Funktion korrekt berechnen können.

#include<iostream>
using namespace std;
int func(int* arr)
{
    
    
	return sizeof(arr);
}

int main()
{
    
    
	int Arr[] = {
    
     2,4,3,1,73,0 };
	cout << func(Arr) << endl;
	system("pause");
	return 0;
}

Das Ausgabeergebnis ist 4 , da die Berechnung hier die Größe eines Zeigers ist.

Die Lösung dieses Problems besteht darin, den Datentyp der formalen Parameter in der Funktion zu steuern , sodass das Array als Referenz an die formalen Parameter der Funktion übergeben wird.

Prinzip

Der Compiler ermöglicht die Übergabe von Arrays an Funktionsparameter per Referenz.
Die zugrunde liegende Syntax lautet:

数据类型(&新数组名)[数组的大小] = 原数组名;

Zum Beispiel:

int Arr[] = {
    
     2,4,3,1,73,0 };
int(&arr)[6] = Arr;

Daher können wir dieses Prinzip nutzen, um dieses Problem auf unterschiedliche Weise zu lösen.

Methode 1 – mit grundlegender Syntax

Wir werden 数据类型(&新数组名)[数组的大小]es als Funktionsparameter verwenden

#include<iostream>
using namespace std;
int func(int(&arr)[6])
{
    
    
	return sizeof(arr);
}

int main()
{
    
    
	int Arr[] = {
    
     2,4,3,1,73,0 };
	cout << func(Arr) << endl;
	system("pause");
	return 0;
}

Das Ausgabeergebnis ist 24 .
Der Vorteil dieser Methode besteht darin, dass sie das Programm sicherer macht, denn wenn die eingehenden Daten nicht die von uns gewünschte Größe haben, wird die Weitergabe verboten und es wird ein Fehler gemeldet.
Die Nachteile liegen auf der Hand: Wir müssen die Größe des verwendeten Arrays im Voraus kennen, und für verschiedene Arrays sind unterschiedliche Funktionsimplementierungen erforderlich, was den sich wiederholenden Code erheblich erhöht.

Methode 2 – Funktionsvorlagen verwenden

Da Funktionsvorlagen automatisch die Datentypen eingehender Funktionsparameter ableiten können, können wir dieses Problem durch die Verwendung von Funktionsvorlagen bequemer lösen.

#include<iostream>
using namespace std;
template<class T>
int func(T& arr)
{
    
    
	return sizeof(arr);
}

int main()
{
    
    
	int Arr[] = {
    
     2,4,3,1,73,0 };
	cout << func(Arr) << endl;
	system("pause");
	return 0;
}

Das Ausgabeergebnis ist 24 .
Dadurch wird unser Problem erfolgreich gelöst, und unabhängig davon, ob es sich bei den eingehenden Daten um ein Zeichenarray, ein Ganzzahlarray oder ein Gleitkommaarray handelt, kann der Verweis auf das eingehende Array automatisch implementiert werden.

Nachwort

Da autoder Datentyp auch automatisch abgeleitet werden kann, ist dies auch eine Möglichkeit, das Problem zu lösen. Da autoer jedoch nicht in der Parameterliste einer Funktion verwendet werden kannauto , ist er auch eine gute Möglichkeit , ihn zu verwenden, wenn er nicht als übergeben wird Funktionsparameter .
Grammatik:

int Arr[] = {
    
     2,4,3,1,73,0 };
auto& arr = Arr;
#include<iostream>
using namespace std;
int main()
{
    
    
	int Arr[] = {
    
     2,4,3,1,73,0 };
	auto& arr = Arr;
	cout << sizeof(arr) << endl;
	system("pause");
	return 0;
}

Das Ausgabeergebnis ist ebenfalls 24 .

おすすめ

転載: blog.csdn.net/qq_49030008/article/details/123557660