Calcula el cuadrado de un numero usando aritmetica de punteros

Iniciado por geeke, 29 Marzo 2015, 19:29 PM

0 Miembros y 1 Visitante están viendo este tema.

geeke

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


ivancea96


rir3760

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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

geeke

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

rir3760

(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
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language