Saltar al contenido

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

Estate atento porque en este artículo vas a encontrar el resultado que buscas.

Solución:

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í se convierte en:

void foo ( char * a );

Si quieres que el array se conserva el tipo, debe pasar una referencia al array:

void foo ( char (&a)[100] );

C++ ’03 8.3.5/3:

…El tipo de una función se determina usando 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 “array 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:

Verifique 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]);

Empezar en el identificador ‘a’

‘a’ es un

Mover a la derecha – encontramos un ) así que invertimos la dirección buscando el (. A medida que nos movemos a la izquierda pasamos &

‘a’ es una referencia

Después de la & llegamos a la apertura ( así que damos marcha atrás de nuevo y miramos a la derecha. ahora vemos [100]

‘a’ es una referencia a un array de 100

Y volvemos a invertir el sentido hasta llegar a char:

‘a’ es una referencia a un array de 100 caracteres

Sí. En C y C++ no puede pasar matrices a funciones. Esa es la forma como es.

¿Por qué estás haciendo matrices simples de todos modos? has mirado boost/std::tr1::array/std::array o std::vector?

Tenga en cuenta que puede, sin embargo, pasar una referencia a un array de longitud arbitraria a una función modelo. La parte superior de mi cabeza:

template< std::size_t N >
void f(char (&arr)[N])

  std::cout << sizeof(arr) << 'n';

Tienes la posibilidad dar recomendación a este artículo si si solucionó tu problema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *