valores retornan referencias referencia que punteros puntero por paso pasar parametros parametro funciones funcion con apuntadores c++ c function-pointers dereference function-call

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) , o foo
  • **foo es equivalente a **(&foo) , o *foo , o foo

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.