Salut, tot eu

M-am apucat sa invat alocare dinamica, am inteles in mare parte, insa m-am incurcat la ceva.Tot ce e in functii am inteles, insa n-am priceput cum iau adr1,adr2 si adr valori in main (e pus acolo comentariu in sursa)
#include<iostream>
using namespace std;
void* cit_mat(int m,int n)
{ int i,j,(*adr1)[10]=new int [10][10];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
cin>>adr1[i][j];
return adr1;
}
void tip_mat(int m,int n, int(*adr1)[10])
{ int i,j;
for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
cout<<adr1[i][j]<<" ";
cout<<endl;
}
}
void* suma_mat(int m,int n, int(*adr1)[10],int (*adr2)[10])
{ int i,j,(*adr)[10]=new int[10][10];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
adr[i][j]=adr1[i][j]+adr2[i][j];
return adr;
}
int main()
{
int m,n,i,j,(*adr)[10],(*adr1)[10],(*adr2)[10];
cout<<"m="; cin>>m;
cout<<"n="; cin>>n;
adr1=(int(*)[10])cit_mat(m,n);//De ce (int(*)[10])cit_mat(m,n)
adr2=(int(*)[10])cit_mat(m,n);//De ce doar operatorul de dereferentiere in paranteze?
adr=(int(*)[10])suma_mat(m,n,adr1,adr2);
tip_mat(m,n,adr);
return 0;
}
PS: Am scris toate functiile ca nustiu...poate ajuta cu ceva, desi problema mea e ca nu inteleg ce se intampla in main...