retornan - punteros por parametro c++
¿De qué sirve el uso de múltiples asteriscos en la llamada de función? (4)
No puedo pensar en ningún uso práctico de múltiples asteriscos en la llamada a la función:
void foo(int a, char b)
{
}
int main(void)
{
(**************foo)(45, ''c'');
//or with pointer to function:
void (*ptr)(int, char) = foo;
(******ptr)(32, ''a'');
}
¿Por qué se permite esto tanto en C como en C ++?
¿Por qué se permite esto tanto en C como en C ++?
No puedo hablar por C ++, pero para C al menos un designador de función se convierte en un puntero:
6.3.2.1 - 4
Un designador de función es una expresión que tiene un tipo de función. Excepto cuando es el operando del operador sizeof o el operador unario, un designador de función con tipo '''' función que devuelve tipo '''' se convierte a una expresión que tiene el tipo '''' puntero a función que devuelve tipo ''''.
La aplicación del operador de indirección produce un designador de función:
6.5.3.2 - 3
El operador unario * denota indirección. Si el operando apunta a una función, el resultado es un designador de función
Entonces, no importa cuántas veces apliques el operador indirecto, obtendrás lo mismo: un designador de función que se convierte inmediatamente en un puntero.
En mi opinión, hay poco o ningún uso al hacer esto.
La forma en que lo entiendo es
* is a pointer to a memory address
& is the value at the Memory address
*foo means pointer to foo memory address
**foo means *(*foo) *(foo memory address) This is a different value from *foo
continúa así ...
Porque el operador *
espera un valor de dirección. Y siempre que se espere un valor (en oposición a un objeto o función glvalue), el lvalue a rvalue, la función al puntero y el array a las conversiones del puntero se aplican en un operando. De modo que la función desreferenciada se convierte de nuevo inmediatamente en un puntero cuando se vuelve a desreferenciar.
Todos estos leen valores de objetos o producen un valor de puntero que hace referencia al comienzo de una matriz o función, respectivamente.
Estas filas de dereferencias no tienen otro propósito que el lulz de la misma.
Una de las conversiones estándar, tanto en C como en C ++, es la conversión de función a puntero; cuando aparece un nombre de función en una expresión, se puede convertir en un puntero a esa función. Asi que:
-
foo
es equivalente a&foo
-
*foo
es equivalente a*(&foo)
, ofoo
-
**foo
es equivalente a**(&foo)
, o*foo
, ofoo
y así.
Esto significa que puede agregar legalmente tantos *
como desee antes de un nombre de función sin cambiar su significado. Sin embargo, no hay razón para hacer eso.