So I figured when making function pointers, you do not need the operator & to get the address of the initial function:
#include <stdio.h>
double foo (double x){
    return x*x;
}
int main () {
    double (*fun1)(double) = &foo;
    double (*fun2)(double) =  foo;
    printf("%f\n",fun1(10));
    printf("%f\n",fun2(10));
    printf("fun1 = %p \t &foo = %p\n",fun1, &foo);
    printf("fun2 = %p \t  foo = %p\n",fun2,  foo);       
    int a[10];
    printf("  a = %p \n &a = %p  \n",a,&a);
    return 0;
}
output:
>./a.out 
100.000000
100.000000
fun1 = 0x4004f4      &foo = 0x4004f4
fun2 = 0x4004f4       foo = 0x4004f4
  a = 0x7fff26804470 
 &a = 0x7fff26804470 
Then I realized this is also true for arrays, meaning that if you have int a[10] both a and &a point to the same location. Why is that with arrays and functions? Is the address saved in a memory location that has the same address as the value(address) being saved in it?
 
     
     
     
     
     
     
    