Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: geeke en 29 Marzo 2015, 19:29 PM

Título: Calcula el cuadrado de un numero usando aritmetica de punteros
Publicado por: geeke en 29 Marzo 2015, 19:29 PM
He encontrado una función algo peculiar la cual calcula el cuadrado de un determinado numero, hasta ahi todo bien pero lo que me llama la atención es el metodo utilizado para llegar a ello.

#include <stdio.h>

int p(int n)
{
    int a[n];
    return (&a)[n] - a;
}

int main(void)
{
    printf("%d\n", p(8));
    return 0;
}


Como se daran cuenta a simple vista uno no supondría que esto saca el cuadrado de un numero es algo confuso y pido que alguien me explique detalladamente como funciona esto

Título: Re: Calcula el cuadrado de un numero usando aritmetica de punteros
Publicado por: ivancea96 en 29 Marzo 2015, 22:15 PM
http://stackoverflow.com/questions/27828822/cant-understand-this-way-to-calculate-the-square-of-a-number (http://stackoverflow.com/questions/27828822/cant-understand-this-way-to-calculate-the-square-of-a-number)

De cualquier modo, es puramente curioso. usa n*n xD
Título: Re: Calcula el cuadrado de un numero usando aritmetica de punteros
Publicado por: rir3760 en 30 Marzo 2015, 04:28 AM
Cita de: CooperJames en 29 Marzo 2015, 19:29 PMHe encontrado una función algo peculiar la cual calcula el cuadrado de un determinado numero, hasta ahi todo bien
El problema con esa forma de obtener el cuadrado es que tal vez funcione o tal vez no ya que la expresión genera UB (comportamiento no definido), la explicación en detalle se encuentra en el vinculo cortesía de ivancea96.

Un saludo
Título: Re: Calcula el cuadrado de un numero usando aritmetica de punteros
Publicado por: geeke en 30 Marzo 2015, 18:44 PM
ivancea96 gracias por el enlace lo acabo de leer y en el mismo mencionan que

Código (cpp) [Seleccionar]
(&a)[n] -a

Es equivalente a

Código (cpp) [Seleccionar]
(a + sizeof(a[n])*n -a) / sizeof(int)

Lo cual no entiendo porque, si me explican como va esto
Título: Re: Calcula el cuadrado de un numero usando aritmetica de punteros
Publicado por: rir3760 en 2 Abril 2015, 05:03 AM
(a + sizeof(a[n])*n -a) / sizeof(int)
Por partes:

1) Ya que "a" se suma y luego se resta la quitamos de la expresión, queda "(sizeof(a[n]) * n) / sizeof(int)".
2) "sizeof(a[n])" es el numero de bytes necesarios para almacenar el array de tipo "int [n]".
3) Multiplicado por "n" es el numero de bytes necesario para almacenar "n" arrays de tipo "int [n]".
4) Para quitar al tipo int de la ecuación se divide por "sizeof(int)", con lo que terminamos con solo la multiplicación "n * n".

Un saludo