int* input; does not allocate memory for an int. It mearly makes it possible to make input point at an int (allocated elsewhere). Currently, by dereferencing it (like you do with *a), you make your program have undefined behavior. If you really want an intermediate pointer variable for this, this example shows how it could be done:
#include <stdio.h>
void square_it(int *a) {
    *a *= *a;     // same as  *a = *a * *a;
}
int main() {
    int data;
    int* input = &data; // now `input` points at an  `int`
    puts("This program squares the input integer number");
    puts("Please put the number:");
    // check that `scanf` succeeds:
    if(scanf("%d", input) == 1) { // don't take its address, it's a pointer already
        square_it(input);
        // since `input` is pointing at `data`, it's actually the value of `data`
        // that is affected by `scanf` and `square_it`, which makes the below work:
        printf("The final value is: %d\n", data);
    }
}
Without an intermediate pointer variable:
#include <stdio.h>
void square_it(int *a) {
    *a *= *a;
}
int main() {
    int input; // note that it's not a pointer here
    puts("This program squares the input integer number");
    puts("Please put the number:");
    if(scanf("%d", &input) == 1) { // here, taking the address of `input` makes sense
        square_it(&input);         // and here too
        printf("The final value is: %d\n", input);
    }
}
Without any pointers at all, it could look like this:
#include <stdio.h>
int square_it(int a) {
    return a * a;
}
int main() {
    int input;
    puts("This program squares the input integer number");
    puts("Please put the number:");
    if(scanf("%d", &input) == 1) { // here, taking the address of `input` makes sense
        int result = square_it(input);
        printf("The final value is: %d\n", result);
    }
}