Nel caso non avessi trattato ancora l'allocazione dinamica della memoria che suggeriva antotan

(
Ho iniziato da poco con il C in ambito universitario.
)

puoi risolvere la cosa anche con una matrice statica, ma il passaggio dei parametri alla funzione va fatto diversamente: in C le matrici vengono allocate per righe in memoria, e per farlo c'è bisogno di sapere ogni riga quanto è lunga, ossia in pratica quante colonne ha la matrice (il numero di colonne si chiama appunto "Leading Dimension of Array", LDA, che in Fortran ad esempio è invece il numero di righe giacché l'allocazione avviene per colonne).

Detto questo, puoi risolvere così:

codice:
#include <stdio.h>

void riempi(int matrice[][4], int i, int j)
{
        int x, y;

        for (x = 0; x < i; x++) {    
                for (y = 0; y < j; y++) {       
                        matrice[x][y] = x + y;
                        printf("%d ", matrice[x][y]);
                }
                putchar('\n');
        }
}

int main(void)
{
        int mat[4][4];
        
        riempi(mat, 4, 4);    
        
        return 0;    
}
senza contare comunque che la dimensione (o le dimensioni) statica dell'array potrebbe essere definita con una costante simbolica (direttiva #define) in maniera tale da rendere più semplice eventuali cambiamenti e anche da evitare il passaggio delle dimensioni come parametri della funzione, che risulterebbero inutili.