C++ usa el método de referencia para pasar arreglos a funciones, evitando la degeneración en punteros debido al paso de funciones y calculando correctamente el tamaño de los arreglos en las funciones.

1. Problema

Sabemos que cuando pasamos una matriz como parámetro a una función, la matriz degenera en un puntero. Esto nos impide calcular correctamente el tamaño de la matriz en la función.

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

El resultado de salida es 4 , porque el cálculo aquí es del tamaño de un puntero.

La forma de resolver este problema es controlar el tipo de datos de los parámetros formales en la función , de modo que la matriz se pase a los parámetros formales de la función por referencia.

principio

El compilador permite pasar arreglos a parámetros de funciones por referencia.
La sintaxis subyacente proporcionada es:

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

Por ejemplo:

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

Por lo tanto, podemos usar este principio para resolver este problema de diferentes maneras.

Método 1 - con sintaxis básica

Lo usaremos 数据类型(&新数组名)[数组的大小]como un parámetro de función.

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

El resultado de salida es 24 .
La ventaja de este método es que hace que el programa sea más seguro, ya que si los datos entrantes no tienen el tamaño que queremos, se prohibirá el paso y se informará de un error.
Las desventajas son más obvias, necesitamos saber el tamaño de la matriz utilizada de antemano, y para diferentes matrices, se requieren diferentes implementaciones de funciones, lo que aumenta mucho el código repetitivo.

Método 2: uso de plantillas de funciones

Debido a que las plantillas de funciones pueden deducir automáticamente los tipos de datos de los parámetros de funciones entrantes, podemos resolver este problema de manera más conveniente mediante el uso de plantillas de funciones.

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

El resultado de salida es 24 .
Esto resuelve con éxito nuestro problema, y ​​no importa si los datos entrantes son una matriz de caracteres, una matriz de enteros o una matriz de coma flotante, la referencia a la matriz entrante se puede implementar automáticamente.

Epílogo

Debido a que autoel tipo de datos también se puede inferir automáticamente, también es una forma de resolver el problema, pero debido a que autono se puede usar en la lista de parámetros de una funciónauto , también es una buena forma de usarlo si no se pasa como un parámetro de función .
gramática:

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

El resultado de salida también es 24 .

Supongo que te gusta

Origin blog.csdn.net/qq_49030008/article/details/123557660
Recomendado
Clasificación