Cuando una función tiene un parámetro de matriz de tamaño específico, ¿por qué se reemplaza con un puntero?

Resuelto CsTamas asked hace 15 años • 3 respuestas

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
  1. ¿Por qué se pasa la matriz como puntero al primer elemento?
  2. ¿Es una herencia de C?
  3. ¿Qué dice la norma?
  4. ¿Por qué se elimina la estricta seguridad de tipos de C++?
CsTamas avatar Aug 25 '09 20:08 CsTamas
Aceptado

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

Richard Corden avatar Aug 25 '2009 13:08 Richard Corden

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
nickolay avatar Dec 21 '2011 16:12 nickolay