Cuando una función tiene un parámetro de matriz de tamaño específico, ¿por qué se reemplaza con un puntero?
Dado el siguiente programa,
#include <iostream>
using namespace std;
void foo( char a[100] )
{
cout << "foo() " << sizeof( a ) << endl;
}
int main()
{
char bar[100] = { 0 };
cout << "main() " << sizeof( bar ) << endl;
foo( bar );
return 0;
}
salidas
main() 100
foo() 4
- ¿Por qué se pasa la matriz como puntero al primer elemento?
- ¿Es una herencia de C?
- ¿Qué dice la norma?
- ¿Por qué se elimina la estricta seguridad de tipos de C++?
Sí, se hereda de C. La función:
void foo ( char a[100] );
Tendrá el parámetro ajustado para que sea un puntero, y así queda:
void foo ( char * a );
Si desea que se conserve el tipo de matriz, debe pasar una referencia a la matriz:
void foo ( char (&a)[100] );
C++ '03 8.3.5/3:
...El tipo de función se determina mediante las siguientes reglas. El tipo de cada parámetro se determina a partir de su propio decl-specifier-seq y declarador. Después de determinar el tipo de cada parámetro, cualquier parámetro de tipo "matriz de T" o "función que devuelve T" se ajusta para que sea "puntero a T" o "puntero a función que devuelve T", respectivamente....
Para explicar la sintaxis:
Busque la regla "derecha-izquierda" en Google; Encontré una descripción aquí .
Se aplicaría a este ejemplo aproximadamente de la siguiente manera:
void foo (char (&a)[100]);
Comience en el identificador 'a'
'una' es una
Mover hacia la derecha - encontramos a )
así que invertimos la dirección buscando el (
. A medida que avanzamos hacia la izquierda pasamos&
'a' es una referencia
Después &
llegamos a la abertura, (
así que volvemos a dar marcha atrás y miramos a la derecha. ahora vemos[100]
'a' es una referencia a una matriz de 100
Y volvemos a invertir el sentido hasta llegar a char
:
'a' es una referencia a una matriz de 100 caracteres
Hay una palabra magnífica en la terminología C/C++ que se utiliza para matrices estáticas y punteros de función: decay . Considere el siguiente código:
int intArray[] = {1, 3, 5, 7, 11}; // static array of 5 ints
//...
void f(int a[]) {
// ...
}
// ...
f(intArray); // only pointer to the first array element is passed
int length = sizeof intArray/sizeof(int); // calculate intArray elements quantity (equals 5)
int ptrToIntSize = sizeof(*intArray); // calculate int * size on your system