void Cambiadimensione(int **vet, int *dim) //cosa significa quell'operatore (**) che precede vet? e perchè non ci sono sono le parentesi quadre?
Quello è un puntatore a puntatore.

Popola(*vet, *dim);//perchè qui invece non hai passato i parametri per riferimento?
Perché la funzione scrive dentro il vettore ma non gli serve la modifica del puntatore.

Cambiadimensione(&vet, &dim); //perchè qui hai usato la &? così non passi l'indirizzo del puntatore?
Perché il puntatore deve essere modificabile e quindi devi passare il puntatore al puntatore.


P.S. Ricordati, anche se non l'ho indicato nel codice, che alla fine ci vuole una free per liberare la memoria.