function pointers in c, dereferencing.

I have a function pointer to calculate addition, substraction, etc for 2 inputed arguments and 1 inputed operation. It works fine when the code return the indexed function pointer (with the inputed index) function pointer with both inputed arguments. but when I initialize a variable with as value this indexed f.p. i. , the result is an address, when I try to dereference this i.f.p. the result is -11.
I don't understand why. Can someone explain me why?

 #include <stdio.h>

//Compiler version gcc  6.3.0
/*On declare 4 fonctions*/
int ad (int num1, int num2);
int sub (int num1, int num2);
int mul (int num1, int num2);
int div (int num1, int num2);

int main()
{
     int chif, num1, num2;
     int(*op[4])(int num1, int num2);
     op[0]=ad;
     op[1]=sub;
     op[2]=mul;
     op[3]=div;

     printf("Choisissez deux nombres separes par enter\n");
     scanf("%d%d", &num1, &num2);
     printf("choisissez un chiffre entre 0 et 3 pour +-*/ \n");
     scanf("%d", &chif);

     printf("le reultat est %d\n", op[chif](num1, num2));
     return 0;
}

int ad (int x, int y)
{
     return (x+y);
}
int sub (int x, int y)
{
     return(x-y);
}
int mul (int x, int y)
{
     return(x*y);
}
int div (int x, int y)
{
     return(x/y);
}

/*
Outputs
Choisissez deux nombres separes par enter
1
2
choisissez un chiffre entre 0 et 3 pour +-*/ 
0
le reultat est 3

Process finished.
*/
#include <stdio.h>

//Compiler version gcc  6.3.0
/*On declare 4 fonctions*/
int ad (int num1, int num2);
int sub (int num1, int num2);
int mul (int num1, int num2);
int div (int num1, int num2);

int main()
{
     int chif, num1, num2;
     int(*op[4])(int num1, int num2);
     op[0]=ad;
     op[1]=sub;
     op[2]=mul;
     op[3]=div;
      int result=op[chif](num1, num2);

     printf("Choisissez deux nombres separes par enter\n");
     scanf("%d%d", &num1, &num2);
     printf("choisissez un chiffre entre 0 et 3 pour +-*/ \n");
     scanf("%d", &chif);

     printf("le reultat est %d\n", result);
     return 0;
}

int ad (int x, int y)
{
     return (x+y);
}
int sub (int x, int y)
{
     return(x-y);
}
int mul (int x, int y)
{
     return(x*y);
}
int div (int x, int y)
{
     return(x/y);
}
/*Outputs
Choisissez deux nombres separes par enter
1
2
choisissez un chiffre entre 0 et 3 pour +-*/ 
0
le reultat est -1931796686

Process finished.
*/

behevior of sscan function

I dont understand the appearent discrepency in the treatment of the variabe x, y, and z.
Why y isn't treated as x and z?

#include <stdio.h>
#include <string.h>

int main()
{
    char result[100] = "Philippe Dupont 30";
    char x[50];
    char y[50];
    int z;
    /*We use sscanf to give a value to the
    three variables x, y and z. the two first are strings 
    and don't need &.*/
    sscanf(result, "%s%s%d", x, y, &z);
    /*Printing the value of the variables works fine.*/
    printf("%s\n", x);
    printf("%s\n", y);
    printf("%d\n", z);

    /*But when I want to print a string in which the variables are, the variable y output
    is an address, not as for x and z*/
    printf("My first name is %s \n my last name is %d \n and I am %d years old\n", x, y, z);

    return 0;
}

/*OUTPUT:
Philippe
Dupont
30
My first name is Philippe
my last name is -478321712
and I am 30 years old

*/