La esencia de la matriz como parámetro de función y formato de función de parámetro deformable estilo C ++

Matriz como parámetro de función

Implementación incorrecta del cuerpo de la función con una matriz de parámetros

#include <iostream>  
using namespace std;  
  
void ShowInf(int arr[2], int n)  
{  
    for (int var : arr)  
    {  
        cout << var << endl;  
    }  
}  
  
int main()  
{  
    int arr[] = { 1,2,3,4 };  
    ShowInf(arr, 2);  
}  

 

La esencia de las matrices como parámetros formales (por puntero)

Cuando el parámetro de función es cualquier forma de matriz, se pasa esencialmente un puntero, pero la dimensión del puntero es diferente.

Puntero unidimensional

Diversión (int arr [2])

Diversión (arr [])

Diversión (* arr)

Nota: Para arreglos unidimensionales, aquí arr [2] no limita el número de elementos después de arr. Es inútil y sin sentido especificar el número de arreglos en arr [].

#include <iostream>  
using namespace std;  
  
void ShowInf(int arr[2], int n)  
{  
    for (int i = 0; i < n; i++)  
    {  
        cout << *(arr + i) << endl;  
    }  
}  
  
int main()  
{  
    int arr[] = { 1,2,3,4 };  
    ShowInf(arr, 3);  // arr[2]不会限制arr后面跟的元素个数
} 

 

Puntero bidimensional

Diversión (arr [] [2])

Diversión (** arr)

Para matrices multidimensionales, existen algunas diferencias:

Si este parámetro no es un parámetro de referencia, también es un puntero que se pasa realmente. Por lo tanto, como el parámetro de una matriz unidimensional, significa que el tamaño de la dimensión más baja (es decir, la más externa) del parámetro de la matriz es innecesario o sin sentido , Pero se debe especificar el tamaño de cada una de las otras dimensiones.

#include <iostream>  
using namespace std;  
  
void ShowInf(int arr[][2]) // 限定传入数组的第二维度的元素必须是两个,但是并未对于第一维度做出限定
{  
    for (int i = 0; i < 2; i++)  
    {  
        for (int j = 0; j < 2; j++)  
        {  
            cout << *(*(arr + i) + j) << endl;  
        }  
    }  
}  
  
int main()  
{  
    int arr[][2] = { {1,2},{3,4} };  
    ShowInf(arr);  
}  

 

Nota: Aunque el parámetro formal tiene la forma de " int  arr [] [2] ", puede limitar el tamaño de la matriz bidimensional, pero esto no limita completamente el formato de la matriz de entrada. Además, las ventajas de los parámetros de matriz referenciados sobre los parámetros de matriz no referenciados se han explicado anteriormente para matrices unidimensionales.

La esencia de las matrices como parámetros formales (referencia a matrices)

En comparación con la "transferencia simple de la primera dirección de la matriz", el uso de la referencia de la matriz como parámetro formal puede limitar el número de elementos de la matriz y es más seguro que usar la dirección de transferencia. No conocemos el almacenamiento en el espacio de almacenamiento correspondiente a la dirección pasando solo una dirección Es más, cuando el puntero es NULL (la matriz no existe), la dirección no es segura como parámetro formal, incluso si podemos verificarla y limitarla en la matriz, es demasiado lenta y problemática.

Cuando usamos "referencia de matriz" como parámetro formal, debido a que la referencia de variable no tiene espacio de almacenamiento, este parámetro debe existir cuando pasamos el parámetro, y la eficiencia de pasar el parámetro mejora enormemente. Puede experimentar con el parámetro en la función rango de acceso. Además, no es necesario pasar el número de elementos de la matriz a los que necesitamos acceder.

#include <iostream>  
using namespace std;  
  
void ShowInf(int (&arr)[2]) // 限定传入数组元素必须是两个  
{  
    for (int var:arr)  // for range进行遍历
    {  
        cout << var << endl;  
    }  
}  
  
int main()  
{  
    int arr[] = { 1,2 };  
    ShowInf(arr);  
}  

 

Parámetros de función de parámetro variable

#include <iostream>  
using namespace std;  
  
int average(initializer_list<int> score)  
{  
    int average = 0, n = 0;  
    for (int var: score)  // 用for range的方式进行遍历
    {  
        average += var;  
        n++;  
    }  
    return (average / n);  
}  
  
int main()  
{  
    cout << average({ 2, 3, 4 }) << endl;  // 注意数据输入格式{Data1,Data2…}
}  

 

Aquí, el initializer_list <DataType> que usamos es un parámetro de plantilla de variable, y debe tenerse en cuenta que las variables que ingresamos son de tipo const por defecto y no se pueden modificar. De hecho, tenemos que desarrollar un buen hábito de programación: "Los parámetros que pasamos a la función solo se utilizan en el cuerpo de la función en lugar de modificarla".

 

Supongo que te gusta

Origin blog.csdn.net/weixin_45590473/article/details/108699625
Recomendado
Clasificación